Video Room

videoroom์€ ์˜์ƒ ํšŒ์˜ ๊ธฐ๋Šฅ์„ ์ธํ„ฐ๋„ท์„ ์ด์šฉํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Omnitalk SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์˜์‹ค(๋ฃธ) ์ƒ์„ฑ ๋ฐ ์ฐธ์—ฌ, ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€์— ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์Œ์„ฑ ํšŒ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Step 1. ์„ธ์…˜ ์ƒ์„ฑ

Omnitalk SDK์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„ ์ ์œผ๋กœ createSession()์„ ํ˜ธ์ถœํ•˜์—ฌ ์„ธ์…˜์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. createSession()์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ userId๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ํ•œ id์ด๋ฉฐ audiocall ๋ฐœ์‹ ์„ ์œ„ํ•œ offerCall() ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. userId๋Š” Optional ์ด๋ฉฐ, nil๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ Omnitalk ์„œ๋ฒ„์—์„œ ์ž„์˜์˜ id๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

try await sdk.createSession(userId: "USER_ID")

Step 2. ํšŒ์˜์‹ค ์ƒ์„ฑ / ์กฐํšŒ

createRoom() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์ด ์ž…์žฅ ํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์˜์‹ค(๋ฃธ)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. createRoom()์˜ ํ•„์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์€ roomType์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Œ์„ฑ ํšŒ์˜์˜ ๊ฒฝ์šฐ๋Š” VIDEO_ROOM ์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. createRoom() API ๋ฆฌํ„ด ๊ฐ์ฒด์— roomId ๋กœ ํšŒ์˜์‹ค์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. roomType์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Optional ์ž…๋‹ˆ๋‹ค.

try await sdk.createRoom(
    roomType: .VIDEO_ROOM,
    subject: "subject",
    secret: "secret",
    startDate: nil,
    endDate: nil
)

์ด๋ฏธ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์˜์‹ค์„ ์ƒ์„ฑ ํ–ˆ๋‹ค๋ฉด roomList() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ƒ์„ฑ๋œ ํšŒ์˜์‹ค ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Œ์„ฑ ํšŒ์˜์‹ค ๋ชฉ๋ก๋งŒ ์กฐํšŒํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ roomType ์„ VIDEO_ROOM ์œผ๋กœ ์ „๋‹ฌํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์กฐํšŒํ•œ ๋ชฉ๋ก ๊ฒฐ๊ณผ์— roomId ๋กœ ํšŒ์˜์‹ค์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try await sdk.roomList(roomType: .VIDEO_ROOM, page: nil)

Step 3. ํšŒ์˜์‹ค ์ฐธ์—ฌ

joinRoom() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์˜์‹ค์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์˜์‹ค์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ„๋„์˜ ์ž‘์—… ์—†์ด ์ฐธ์—ฌ์ž๋“ค๊ณผ ์Œ์„ฑ ํšŒ์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ, ์˜์ƒ ์†ก์ถœ์€ ๋‹ค์Œ ์Šคํ…์„ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค. ํšŒ์˜์‹ค์— ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ ๋ฉ”์„ธ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์ƒ ํšŒ์˜์—์„œ ์ˆ˜์‹  ๊ฐ€๋Šฅํ•œ ์ด๋ฒคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Event Message ๋ฅผ ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • CONNECTED_EVENT - ์ƒˆ๋กœ์šด ์ฐธ๊ฐ€์ž ์ž…์žฅํ–ˆ์„ ๋•Œ

  • BROADCASTING_EVENT - ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž๊ฐ€ ์˜์ƒ์„ ์†ก์ถœํ–ˆ์„ ๋•Œ

  • LEAVE_EVENT - ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž๊ฐ€ ํ‡ด์žฅ ํ–ˆ์„ ๋•Œ

  • MUTE_EVENT - ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž๊ฐ€ mute ํ–ˆ์„ ๋•Œ

  • UNMUTE_EVENT - ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž๊ฐ€ unmute ํ–ˆ์„ ๋•Œ

  • SCREEN_SHARE_EVENT - ํ™”๋ฉด ๊ณต์œ  ๋ฐœ์ƒ ์ด๋ฒคํŠธ

  • SCREEN_UNSHARE_EVENT - ํ™”๋ฉด ๊ณต์œ  ์ข…๋ฃŒ ์ด๋ฒคํŠธ

  • MESSAGE_EVENT - ์ฑ„ํŒ… ๋ฉ”์„ธ์ง€ ์ˆ˜์‹  ์ด๋ฒคํŠธ, ํšŒ์˜์‹ค ์ž…์žฅ์‹œ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฑ„ํŒ…๊ธฐ๋Šฅ ์‚ฌ์šฉ๋ฒ•์€ Chatting ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

try await sdk.joinRoom(roomId: roomId, secret: "secret", userName: "userName")

Step 4. ์˜์ƒ ์†ก์ถœ

publish() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์นด๋ฉ”๋ผ ์˜์ƒ์„ ์†ก์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†ก์ถœ๋˜๋Š” ์˜์ƒ์„ ํ™”๋ฉด์— ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜์ƒ์„ ์ถœ๋ ฅํ•  RTCMTLVideoView ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ WebRTC ๋ชจ๋“ˆ์„ import ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( Omnitalk SDK ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ๋ชจ๋“ˆ )

publish๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž๋“ค์€ BROADCASTING_EVENT ์ด๋ฒคํŠธ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฐฉ์†ก ๊ตฌ๋…์€ ๋‹ค์Œ ์Šคํ…์„ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

import WebRTC

let localView = await RTCMTLVideoView()
try await sdk.publish(view: localView)

Step 5. ์˜์ƒ ๊ตฌ๋…

subscribe() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†ก์ถœ๋œ ์˜์ƒ์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜์ƒ ์†ก์ถœ์ž์˜ session ์„ ์ „๋‹ฌํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. session์€ partiList() API ๋˜๋Š” BROADCASTING_EVENT ๋˜๋Š” SCREEN_SHARE_EVENT ์—์„œ ํ™•์ธ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†ก์ถœ๋˜๋Š” ์˜์ƒ์„ ํ™”๋ฉด์— ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜์ƒ์„ ์ถœ๋ ฅํ•  RTCMTLVideoView ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ WebRTC ๋ชจ๋“ˆ์„ import ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( Omnitalk SDK ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ๋ชจ๋“ˆ )

import WebRTC

let remoteView = await RTCMTLVideoView()
try await sdk.subscribe(
    publisherSession: publisherSession,
    view: remoteView
)

์˜์ƒ ๊ตฌ๋… ์ทจ์†Œ

unsubscribe() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋…์ค‘์ด๋˜ ์˜์ƒ์„ ๊ตฌ๋… ์ทจ์†Œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try await sdk.unsubscribe(publisherSession: publisherSession)

Step 6. ํšŒ์˜์‹ค ํ‡ด์žฅ

leave() API๋ฅผ ํ†ตํ•ด์„œ ํšŒ์˜์‹ค์—์„œ ํ‡ด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์— session์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ž์‹ ์˜ ๋ฐฉ์†ก์„ ์ข…๋ฃŒํ•˜๊ณ  ํ‡ด์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. session๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น session์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ํ‡ด์žฅ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒํ™ฉ์€ ์ˆ˜์‹  ๊ฑฐ์ ˆ์ด๋‚˜ ๊ฐ•์ œ ํ‡ด์žฅ ๋“ฑ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try await sdk.leave()

๋ชฉ๋ก ์กฐํšŒ

์ฐธ์—ฌ์ž ๋ชฉ๋ก ์กฐํšŒ

partiList() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…์žฅํ•œ ํšŒ์˜์‹ค์— ์ฐธ์—ฌํ•œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ถ”๊ฐ€ ์˜ˆ์ • - partiList์˜ ๊ฒฐ๊ณผ์— ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž์˜ mute ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ์†ก ๋ชฉ๋ก ์กฐํšŒ

publishList() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…์žฅํ•œ ํšŒ์˜์‹ค์— ์†ก์ถœ์ค‘์ธ ๋ฐฉ์†ก ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™”๋ฉด๊ณต์œ  ์ •๋ณด ์กฐํšŒ

screenList() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…์žฅํ•œ ํšŒ์˜์‹ค์— ์†ก์ถœ์ค‘์ธ ํ™”๋ฉด ๊ณต์œ  ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋””์˜ค ์žฅ์น˜ ์ œ์–ด

mute/unmute

์˜์ƒ ์ „ํ™”์ค‘์— ์˜์ƒ ์†ก์ถœ์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•๊ณผ ์ž์„ธํ•œ ๋‚ด์šฉ์€ API Reference์˜ mute/unmute ๋ถ€๋ถ„์„ ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. mute/unmute API์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ TRACK_TYPE ์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try await sdk.setMute(track: .VIDEO)

์ž…๋ ฅ ์žฅ์น˜ ๋ณ€๊ฒฝ

์ „ํ™” ํ†ตํ™”์ค‘์— ์ž…๋ ฅ(์นด๋ฉ”๋ผ) ์žฅ์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก setVideoDevice() API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์ธ CAM_TYPE์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ›„๋ฉด ์นด๋ฉ”๋ผ์ธ back ํƒ€์ž…๊ณผ ์ „๋ฉด ์นด๋ฉ”๋ผ์ธ front ๋‘ ๊ฐ€์ง€๋กœ ์ œ๊ณต ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try await sdk.setVideoDevice(type: .back)

์˜ค๋””์˜ค ์žฅ์น˜ ์ œ์–ด

mute/unmute

์ „ํ™” ํ†ตํ™”์ค‘์— ์Œ์†Œ๊ฑฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•๊ณผ ์ž์„ธํ•œ ๋‚ด์šฉ์€ API Reference์˜ mute/unmute ๋ถ€๋ถ„์„ ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. mute/unmute API์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ TRACK_TYPE ์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try await sdk.setMute(track: .AUDIO)

์ž…๋ ฅ ์žฅ์น˜ ๋ณ€๊ฒฝ

์ „ํ™” ํ†ตํ™”์ค‘์— ์ž…๋ ฅ(๋งˆ์ดํฌ) ์žฅ์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก setAudioDevice() API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์ธ MIC_TYPE์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ท€์— ๋Œ€์–ด ์ „ํ™”๋ฐ›๋Š” defaultInEar ํƒ€์ž…๊ณผ ์Šคํ”ผ์ปคํฐ ๋ชจ๋“œ์ธ speaker ๋‘ ๊ฐ€์ง€๋กœ ์ œ๊ณต ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try await sdk.setAudioDevice(type: .speaker)

๋ฃธ ์‚ญ์ œ

ํ˜„์žฌ ์ฐธ์—ฌ์ค‘์ด์ง€ ์•Š์€ ํšŒ์˜์‹ค์€ destroyRoom() API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์˜์‹ค์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated