Quick Start
Omnitalk SDK๋ ์ฝ๊ณ ๊ฐํธํ๊ฒ webrtc ๊ธฐ์ ์ ์ด์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ง ํจํค์ง์ ๋๋ค. Omnitalk SDK์ ๋ชจ๋ API๋ async ~ await ๊ตฌ์กฐ๋ก ์์ฑ๋์์ต๋๋ค. ์์ฒญ์ด ์คํจํ๋ฉด ์๋ฌ๋ฅผ throw ํฉ๋๋ค. ์์ธ API ์ฌ์ฉ๋ฒ์ FLUTTER API Reference๋ฅผ ์ฐธ์กฐ๋ฐ๋๋๋ค. 1:1 ํตํ๋ฅผ ๊ตฌํํ ์ ์๋ ์ฝ ๊ธฐ๋ฅ๊ณผ ๋ค์๊ฐ ํ์์ค์ ๊ตฌํํ ์ ์๋ ๋ฃธ์ ๊ตฌ๋ถํ์ฌ ์ค๋ช ํฉ๋๋ค.
1:1 ์์ฑ/์์ ํตํ
1. ์ด๋ํก ๊ฐ์ฒด ์์ฑ
๋ฐ๊ธ๋ฐ์ Service Id์ Service Key๋ก omnitalk ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. (Service Id์ Service Key๋ console ํ์ด์ง์์ ๋ฐ๊ธ ๊ฐ๋ฅํ๋ฉฐ ๋ ธ์ถ๋์ง ์๋๋ก ์ฃผ์ํ์ฌ์ผ ํฉ๋๋ค.)
import 'package:omnitalk_sdk/omnitalk_sdk.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
Omnitalk.sdkInit(
serviceId: 'Service ID', serviceKey: 'Service KEY');
Omnitalk sdk = Omnitalk.getInstance();2. ์ธ์
์์ฑ
์ธ์๋ก ์ ๋ฌํ user_id์ ์ธ์ ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค. user_id ์๋ต์ Omnitalk ์๋ฒ์์ ์์์ id๋ฅผ ๋ถ์ฌํฉ๋๋ค.
await sdk.createSession();3. 1:1 ์์ฑ ํตํ
1:1 ์์ฑ ํตํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ฐ์ ๊ธฐ๋ฅ์ offerCall API๋ฅผ ํธ์ถํ์ฌ ๊ตฌํํฉ๋๋ค. ์์ธ ๊ธฐ๋ฅ ๊ตฌํ ์์๋ Dev guide์ audio call ํญ๋ชฉ์ ์ฐธ์กฐ ๋ฐ๋๋๋ค. call flow๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ๋ฐ๋๋๋ค.
3.1 ๋ฐ์
์ธ์
์ด ๋ง๋ค์ด์ง ์ํ์์ call type๊ณผ ์ฐฉ์ ์๋๋ฐฉ์ธ callee์ user_id๋ฅผ ์ ๋ฌํฉ๋๋ค. offerCall ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด caller์๊ฒ๋ RINGBACK_EVENT๊ฐ, callee์๊ฒ๋ RINGING_EVENT๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
String callee = '[email protected]';
await sdk.offerCall(
callType: CallType.audiocall,
callee : callee); //๋ฐ์ ์ธก3.2 ์์
callee์ธก์ด answerCall์ ํธ์ถํ๋ฉด caller, caller ์์ธก์ CONNECTED_EVENT๋ฅผ ์์ ํ๊ณ ์์ฑํตํ๊ฐ ์ฐ๊ฒฐ๋ฉ๋๋ค. callee๋ leave API๋ฅผ ์ด์ฉํ์ฌ ์์ ๊ฑฐ์ ํ ์ ์์ต๋๋ค.
String callerSession = '';
sdk.on('event', (dynamic msg) async {
switch (msg["cmd"]) {
case "RINGING_EVENT":
callerSession = msg['session']
break;
}
}
);
await sdk.answerCall(); // ์ฐฉ์ ์ธก
await sdk.leave(session: callerSession); // ์์ ๊ฑฐ์ 4. 1:1 ์์ ํตํ
1:1 ์์ ํตํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ฐ์ ๊ธฐ๋ฅ์ offerCall API๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํฉ๋๋ค. ์์ธ ๊ธฐ๋ฅ ๊ตฌํ ์์๋ Dev guide์ video call ํญ๋ชฉ์ ์ฐธ์กฐ ํ์๊ธฐ ๋ฐ๋๋๋ค. call flow๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ ํ์๊ธฐ ๋ฐ๋๋๋ค.
์ธ์
์ด ๋ง๋ค์ด์ง ์ํ์์ call type๊ณผ ์ฐฉ์ ์๋๋ฐฉ์ธ callee์ user_id, ๊ทธ๋ฆฌ๊ณ caller, callee์ ์์์ ๋ด์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํฉ๋๋ค. offerCall ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด caller์๊ฒ๋ RINGBACK_EVENT๊ฐ, callee์๊ฒ๋ RINGING_EVENT๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
String callee = '[email protected]'
RTCVideoRenderer localvideo = RTCVideoRenderer();
RTCVIdeoRenderer remotevideo = RTCVideoRenderer();
await sdk.offerCall(
callType: CallType.videocall,
callee: callee,
record: false,
localRenderer: localVideo,
remoteRenderer: remoteVideo
);์ฐฉ์ ์ธก์ RINGING_EVENT๋ฅผ ๋ฐ๊ณ answerCall API๋ฅผ ์ด์ฉํด ํตํ๋ฅผ ์๋ฝํ๊ฑฐ๋ leave API๋ฅผ ์ด์ฉํด ๊ฑฐ์ ํ ์ ์์ต๋๋ค.
String caller = '';
String callerSession = '';
RTCVideoRenderer localvideo = RTCVideoRenderer();
RTCVIdeoRenderer remotevideo = RTCVideoRenderer();
sdk.on('event', (dynamic msg) async {
switch (msg["cmd"]) {
case "RINGING_EVENT":
callerSession = msg['session']
caller = msg['caller']
break;
}
}
);
await sdk.answerCall(
callType: CallType.videocall,
caller: caller,
localRenderer: localVideo,
remoteRenderer: remoteVideo
);๋ค์๊ฐ ํ์
1. ์ด๋ํก ๊ฐ์ฒด ์์ฑ
๋ฐ๊ธ๋ฐ์ Service Id์ Service Key๋ก omnitalk ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. (Service Id์ Service Key๋ console ํ์ด์ง์์ ๋ฐ๊ธ ๊ฐ๋ฅํ๋ฉฐ ๋ ธ์ถ๋์ง ์๋๋ก ์ฃผ์ํ์ฌ์ผ ํฉ๋๋ค.)
import 'package:omnitalk_sdk/omnitalk_sdk.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
Omnitalk.sdkInit(
serviceId: 'Service ID', serviceKey: 'Service KEY');
Omnitalk sdk = Omnitalk.getInstance();2. ์ธ์
์์ฑ
์ธ์๋ก ์ ๋ฌํ user_id์ ์ธ์ ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค. user_id ์๋ต์ Omnitalk ์๋ฒ์์ ์์์ id๋ฅผ ๋ถ์ฌํฉ๋๋ค.
await sdk.createSession();3. ๋ฃธ ์์ฑ
์ธ์๋ก ์ ๋ฌํ ๋ฃธ ํ์ ์ ๋ฐฉ์ ์์ฑํฉ๋๋ค. (RoomType.videoroom | RoomType.audioroom)
var roomResult = await sdk.createRoom(roomType: RoomType.videoroom);4. ๋ฃธ ์ฐธ์ฌ
๋ฃธ์ ์ฐธ์ฌํ๊ฒ ๋๋ฉด ์๋์ผ๋ก ์ค๋์ค ๋ฐฉ์ก์ ์์ํ๊ณ ์ฑํ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ์ํ๊ฐ ๋ฉ๋๋ค.
String roomId = roomResult['room_id'];
await sdk.joinRoom(roomId :roomId);5. ๋ฐฉ์ก ์์ (video)
์ค๋์ค ๋ฐฉ์ก์ ๋ฃธ์ ์ฐธ์ฌํ๋ ๊ฒ๋ง์ผ๋ก ์์ ๊ฐ๋ฅํ๋ฉฐ ์์ ๋ฐฉ์ก์ ์์ ์ ๋ฐฉ์ก ์์ ์คํธ๋ฆผ์ ๋ด์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด ๋ฐฉ์ก์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. publish APIํธ์ถ์ด ์ฑ๊ณตํ๋ฉด ํด๋น ๋ฐฉ์ก์ ์ธ์ id๊ฐ ๋ด๊ธด ๊ฐ์ฒด๋ฅผ ๋ฆฌํด ๋ฐ๊ฒ ๋ฉ๋๋ค.
RTCVideoRenderer localvideo = RTCVideoRenderer();
await sdk.publish(localRenderer: localVideo);6. ๋ฐฉ์ก ๊ตฌ๋
(video)
๊ตฌ๋
ํ๊ณ ์๋ ๋ฐฉ์ก์ session์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ํด๋น ๋ฐฉ์ก์ ๊ตฌ๋
ํ ์ ์์ต๋๋ค. ๋ฃธ์์ ๋ฐฉ์ก์ ๊ฐ์ํ ์ฌ์ฉ์์ ๋ฆฌ์คํธ๋ฅผ ์กฐํ(publishList API)ํ๊ฑฐ๋ BROADCASTING_EVENT์ ์ด๋ฒคํธ ๋ฉ์์ง์์ ํ์ธํ ์ ์์ต๋๋ค.
await sdk.subscribe(
publisherSession: publisherSession,
remoteRenderer: remoteVideo);7. ์ด๋ฒคํธ ๋ฉ์์ง ์์
์ด๋ํก SDK์์ ์ ๋ฌํ๋ ์ด๋ฒคํธ ๋ฉ์์ง ๊ท๊ฒฉ๊ณผ ๋ฉ์์ง ์์ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค. ๋ค์์ ๋ฐฉ์ก ์ด๋ฒคํธ ๋ฐ์์ ๋ฐฉ์ก ์ธ์ ์ ์ ์ฅํ๋ ์์์ ๋๋ค.
sdk.on('event', (dynamic event) async {
var msg = event;
switch (msg["cmd"]) {
case "BROADCASTING_EVENT":
setState(() {
publisherSession = msg['session'];
});
print('publisherSession : $publisherSession');
break;
case "CONNECTED_EVENT":
print('Audio Connected');
break;
case "LEAVE_EVENT":
print('${msg['session']} has left');
break;
}
});8. ์ฑํ
๋ฉ์์ง
์ด๋ค ํ์ ์ด๋ ๋ฃธ์ ์ฐธ์ฌํ๊ฒ ๋๋ฉด ์ฑํ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค. sendMessage API๋ฅผ ์ด์ฉํ์ฌ action type์ ๋ช ์ํ๋ฉด ๋ฃธ ์ ์ฒด์ ์ฑํ ๋ฉ์์ง ๋ฐ์ก ๋ฐ ํน์ ์๋๋ก์ ๊ท์๋ง ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ท์๋ง์ ์๋์ session id๋ฅผ target ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
await sdk.sendMessage(action: MessageAction.send, message: msg); // ๋ฃธ ์ ์ฒด ๋ฉ์์ง ์ ์ก
await sdk.sendMessage(
action : MessageAction.whisper,
message : whispermsg,
target : target,
); // ํน์ ์๋์ ๊ท์๋ง ๋ฉ์์ง ์ ์ก9. ๋ฐฉ์ก ์ข
๋ฃ
๋ฐฉ์ก์ ์ข ๋ฃํ๋ API์ ๋๋ค. ์ข ๋ฃ์ํค๊ณ ์ถ์ session id๋ฅผ ์ ๋ฌํ๋ฉด ์์ ๊ฑฐ์ ์ด๋ ๊ฐ์ ํด์ฅ ๋ฑ์ ๊ธฐ๋ฅ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค. session์ ์ ๋ฌํ์ง ์์ผ๋ฉด ์์ ์ ๋ฐฉ์ก์ ์ข ๋ฃํ๊ฒ ๋ฉ๋๋ค.
await sdk.leave();Last updated