그룹 통화 화면 공유
그룹 통화(컨퍼런스)에서 화면을 공유하는 예제 코드입니다.
송신 측 - 화면 캡처 준비 및 시작
-
그룹 통화에 참여한 후, 캡처할 수 있는 스크린(모니터) 및 윈도우(애플리케이션) 목록을 받으세요.
class YourApplication {
private:
PlanetKit::PlanetKitConference m_pConference;
}
void YourApplication::RefreshScreenShareList() {
PlanetKit::PlanetKitManagerPtr pManager = PlanetKit::PlanetKitManager::GetInstance();
PlanetKit::ScreenShareControllerPtr pController = pManager->GetScreenShareController();
PlanetKit::ScreenShareInfoArray arrScreenShare;
pController->GetScreenShareInfos(arrScreenShare);
} -
StartMyScreenShare()
를 호출해서 화면 캡처 전송을 시작하세요. 이때 캡처할 대상은 1단계에서 얻어 온 Array에서 선택할 수 있습니다.strSubgroupName
파라미터는 화면 공유의 대상 서브그룹을 결정하며,NullOptional
인 경우 화면 공유가 기본 방(main room)으로 전송됩니다.StartMyScreenShare()
호출 결과는ResultCallback
유형의 콜백 함수로 확인할 수 있으며, 성공했을 경우 렌더링을 위한 윈도우를 등록할 수 있습니다.
void YourApplication::StartScreenShare(PlanetKit::ScreenShareInfoPtr pTarget, const WStringOptional& strSubgroupName) {
// This is result callback function.
auto callback = [](void* pUserData, bool bSuccess) {
// You can check result of `StartScreenShare` with parameter `bSuccess`.
if(bSuccess == true) {
// You can set rendering window.
YourApplication* pApp = (YourApplication*)pUserData;
pApp->m_pConference->AddMyScreenShareVideoView(pApp->m_hScreenShareRenderWnd);
}
};
// Start screen share.
bool bResult = m_pConference->StartMyScreenShare(
pTarget,
strSubgroupName,
this,
callback
);
}
송신 측 - 화면 공유 종료
StopMyScreenShare()
를 호출해 화면 공유를 종료하고, 화면 캡처 준비 및 시작 2번 단계에서처럼 ResultCallback
유형의 콜백 함수로 결과를 확인하세요.
void YourApplication::StopScreenShare() {
...
// You can use callback parameter by using lambda function.
bool bResult = false = m_pConference->StopMyScreenShare(nullptr, [](void* pUserData, bool bSuccess) {
// You can check result of `StopMyScreenShare()` with the `bSuccess` parameter.
if(bSuccess == true) {
...
}
});
// Remove rendering window.
m_pConference->RemoveMyScreenShareVideoView(m_hScreenShareRenderWnd);
}
수신 측 - 화면 공유 업데이트 이벤트 수신
먼저 IPeerControlEvent
의 OnScreenShareUpdated
이벤트를 통해 피어의 화면 공유가 시작 또는 중지되었는지 확인해야 합니다.
class PeerControlEventListener : public PlanetKit::IPeerControlEvent {
public:
void OnScreenShareUpdated(PlanetKit::PeerControlPtr pPeerControl, PlanetKit::SubgroupPtr pSubgroup, PlanetKit::EScreenShareState eState) override {
std::wstring message = L"OnScreenShareUpdated, User=" + pPeerControl->GetPeer()->GetUserID()->GetID().c_str() + L" ScreenShareState=" + std::to_wstring(eState) + L"\n";
OutputDebugStringW(message.c_str());
if(eState == PlanetKit::EScreenShareState::PLNK_SCREEN_SHARE_STATE_ENABLED) {
m_pYourApp->RequestPeerScreenShare(pPeerControl, pSubgroup);
}
else {
m_pYourApp->StopPeerScreenShare();
}
}
private:
YourApplication* m_pYourApp; // Prepare instance of YourApplication
};
수신 측 - 피어의 화면 공유 비디오를 요청하고 받은 비디오를 렌더링
피어의 화면 공유 비디오를 요청하려면 PeerControl
의 StartScreenShare()
를 호출하세요.
수신되는 화면 공유 비디오를 렌더링하려면 PeerControl
의 SetScreenShareView()
를 호출하세요.
class YourApplication {
public:
void RequestPeerScreenShare(PlanetKit::PeerControlPtr pPeerControl, PlanetKit::SubgroupPtr pSubgroup) {
auto callback = [](void* pUserData, bool bSuccess) {
YourApplication* pApp = (YourApplication*)pUserData;
if(bSuccess == true) {
// Render peer's screen share.
pApp->m_pScreenSharePeerControl->SetScreenShareView(m_hScreenShareRenderWnd);
}
}
// You can keep instance of PeerControl for the peer who is performing screen share.
m_pScreenSharePeerControl = pPeerControl;
// Start peer's screen share.
pPeerControl->StartScreenShare(pSubgroup->GetSubgroupName(), this, callback);
}
private:
PlanetKit::PeerControlPtr m_pScreenSharePeerControl;
}
수신 측 - 피어의 화면 공유 비디오 수신 중단
피어의 화면 공유 비디오 수신을 중단하려면 PeerControl
의 ClearScreenShareView()
를 호출하여 렌더링을 중단하고, PeerControl
의 StopScreenShare()
를 호출하세요.
class YourApplication {
public :
void StopPeerScreenShare() {
// Remove render.
m_pScreenSharePeerControl->ClearScreenShareView();
// Request to stop screen share.
m_pScreenSharePeerControl->StopScreenShare();
}
}