グループ通話画面共有
グループ通話(カンファレンス)で画面を共有するサンプルコードです。
送信側 - 画面キャプチャーの準備と開始
-
グループ通話に参加した後、キャプチャーできるスクリーン(モニター)およびウィンドウ(アプリケーション)リストを取得してください。
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();
}
}