반응형

 Window에서 C++ 기반의 Native WebRTC App을 개발하기 위해서는 WebRTC Native API 를 사용해야 한다. WebRTC Native API의 핵심은 PeerConnection 에 있는데, 제대로 설명이 된 문서를 구하기는 쉽지 않다. 

 단 WebRTC Native Library 를 Windows 환경 기반으로 빌드하였다면 내려받은 소스 폴더 중 src\examples\peerconnection\client 에 있는 소스를 분석해 보면 Native API를 사용하는 방법을 알 수 있다. 


 분석시 참고해야 할 자료는 https://webrtc.org/native-code/native-apis/ 에 나와 있는 다음의 블록 다이어 그램을 봐야 한다.


그리고 Threading Model 부분을 유심히 봐야 하는데, Thread를 해당 모델처럼 생성하지 않으면 제대로 동작하지 않는다. 다음은  https://webrtc.org/native-code/native-apis/  에 나와있는 Threading Model에 대한 텍스트이다.

Threading Model

WebRTC Native APIs use two globally available threads: the signaling thread and the worker thread. Depending on how the PeerConnection factory is created, the application can either provide those two threads or just let them be created internally.

Calls to the Stream APIs and the PeerConnection APIs will be proxied to the signaling thread, which means that an application can call those APIs from whatever thread.

All callbacks will be made on the signaling thread. The application should return the callback as quickly as possible to avoid blocking the signaling thread. Resource-intensive processes should be posted to a different thread.

The worker thread is used to handle more resource-intensive processes, such as data streaming.


요는, WebRTC Native API는 2개의 global thread를 사용하는데 이중 하나는 signaling 처리를 위한 Thread와  스트리밍과 같은 Resource-Intensive 한 작업을 처리하기 위한 Thread가 필요하다는 것이다.


실제로 PeerConnectionFactory Interface를 생성할때 다음의 두 Thread를 넘겨 준다. 다음은 PeerConnection을 생성하는 코드이다.


rtc::Thread* _signalingThread = new rtc::Thread();

rtc::Thread* _workerThread = new rtc::Thread();

rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pcf = 

    webrtc::CreatePeerConnectionFactory(_signalingThread, _

        workerThread, NULL, NULL, NULL).release();

webrtc::PeerConnectionInterface::RTCConfiguration config;

webrtc::PeerConnectionInterface::IceServer server;

server.uri = "stun:stun.l.google.com:19302";

config.servers.push_back(server);

webrtc::FakeConstraints constraints;

constraints.AddOptional(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,"true");

rtc::scoped_refptr<webrtc::PeerConnectionInterface> pc = 

    pcf->CreatePeerConnection(config, &constraints, NULL, NULL, pco);


(여기에서 pco는 PeerConnectionObserver 을 상속받아서 구현한 PeerconnectionObserver 클래스이다.)

반응형
Posted by alias
,