본문으로 건너뛰기
Version: 5.5

그룹 통화 화면 공유

그룹 통화(컨퍼런스)에서 화면을 공유하는 예제 코드입니다.

송신 측 - 화면 캡처 준비 및 시작

  1. 그룹 통화에 참여한 후, 캡처할 수 있는 스크린(모니터) 및 윈도우(애플리케이션) 목록을 받으세요.

    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);
    }
  2. 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);
}

수신 측 - 화면 공유 업데이트 이벤트 수신

먼저 IPeerControlEventOnScreenShareUpdated 이벤트를 통해 피어의 화면 공유가 시작 또는 중지되었는지 확인해야 합니다.

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
};

수신 측 - 피어의 화면 공유 비디오를 요청하고 받은 비디오를 렌더링

피어의 화면 공유 비디오를 요청하려면 PeerControlStartScreenShare()를 호출하세요.

수신되는 화면 공유 비디오를 렌더링하려면 PeerControlSetScreenShareView()를 호출하세요.

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;
}

수신 측 - 피어의 화면 공유 비디오 수신 중단

피어의 화면 공유 비디오 수신을 중단하려면 PeerControlClearScreenShareView()를 호출하여 렌더링을 중단하고, PeerControlStopScreenShare()를 호출하세요.

class YourApplication {
public :
void StopPeerScreenShare() {
// Remove render.
m_pScreenSharePeerControl->ClearScreenShareView();

// Request to stop screen share.
m_pScreenSharePeerControl->StopScreenShare();
}
}

관련 예제 코드

관련 문서