ビデオレシーバー
ビデオレシーバー機能を使用すると、実際のビデオストリームに影響を与えることなく、ビデオデータを取得できます。アプリケーションでは、この機能を利用してビデオデータのコピーを受け取り、さまざまな用途に使用できます。
| 対応する通話タイプ | SDKの最低バージョン |
|---|---|
| 1対1通話、グループ通話(カンファレンス) | PlanetKit 7.0 |
活用事例
ビデオレシーバーの主な活用例は次のとおりです。
- ビデオ分析と品質のモニタリング
- 通話分析と指標の収集
- サムネイルの作成
実装段階
ビデオレシーバー機能を実装するには、次の手順に従います。
1対1通話
ビデオレシーバーの実装
1対1通話からビデオデータを受信するためにIVideoReceiverを継承するクラスを作成します。
#include "PlanetKit.h"
#include "IVideoReceiver.h"
class VideoFrameReceiver : public PlanetKit::IVideoReceiver {
public:
void OnVideo(const PlanetKit::SVideoFrame& sVideoFrame, PlanetKit::UserIdPtr pUserID) override {
// Access video frame properties from SVideoFrame structure:
// - sVideoFrame.pbuffer: Pointer to the frame buffer
// - sVideoFrame.unBufferSize: Allocated buffer size
// - sVideoFrame.unDataLength: Actual length (in bytes) of buffer data
// - sVideoFrame.unWidth: Frame width in pixels
// - sVideoFrame.unHeight: Frame height in pixels
// - sVideoFrame.llTick: Tick count in microseconds
// - sVideoFrame.llTimeStamp: Timestamp
// - sVideoFrame.llDuration: Frame duration
// - sVideoFrame.eRotation: Rotation angle
// - sVideoFrame.bSubgroupMain: Whether frame belongs to main room
// - sVideoFrame.szSubgroupName: Subgroup name (if bSubgroupMain is false)
// For local user, pUserID's GetID() and GetServiceID() return empty strings
if (pUserID && !pUserID->GetID().empty()) {
// Peer's video frame
// Access peer information:
const PlanetKit::WString& userId = pUserID->GetID();
const PlanetKit::WString& serviceId = pUserID->GetServiceID();
} else {
// Local user's video frame
}
// Use the video frame for your use case
// Note: Copy data if you need it beyond this callback
}
};
ビデオレシーバーの設定
ビデオデータの受信を開始するには、PlanetKitCall(通話中)またはCameraController(プレビューモード、ローカルビデオ専用)インスタンスにレシーバーを登録します。
ローカルビデオ(プレビューモード)
// Get camera controller instance
PlanetKit::CameraControllerPtr pCameraController = PlanetKit::PlanetKitManager::GetInstance()->GetCameraController();
// Create receiver instance
PlanetKit::IVideoReceiverPtr pMyVideoReceiver = PlanetKit::MakeAutoPtr<VideoFrameReceiver>();
// Start preview with receiver
bool success = pCameraController->StartPreview(pMyVideoReceiver);
if (!success) {
// Handle error
}
ローカルビデオ(通話中)
// Create receiver instance
PlanetKit::IVideoReceiverPtr pMyVideoReceiver = PlanetKit::MakeAutoPtr<VideoFrameReceiver>();
// Register receiver to get local video during call
bool success = m_pCall->AddMyVideoReceiver(pMyVideoReceiver);
if (!success) {
// Handle error
}
リモートビデオ
// Create receiver instance
PlanetKit::IVideoReceiverPtr pPeerVideoReceiver = PlanetKit::MakeAutoPtr<VideoFrameReceiver>();
// Register receiver to get peer's video
bool success = m_pCall->AddPeerVideoReceiver(pPeerVideoReceiver);
if (!success) {
// Handle error
}
ビデオレシーバーの解除
ビデオデータの受信を中止してリソースを整理するには、レシーバーの登録を解除します。
// For local video (preview)
pCameraController->StopPreview();
// For local video (during call)
bool success = m_pCall->RemoveMyVideoReceiver(pMyVideoReceiver);
if (!success) {
// Handle error
}
// For peer video
bool success = m_pCall->RemovePeerVideoReceiver(pPeerVideoReceiver);
if (!success) {
// Handle error
}
グループ通話
ビデオレシーバーの実装
グループ通話の場合、1対1通話で使用したものと同じIVideoReceiverインターフェースを使用します。
ビデオレシーバーの設定
ビデオデータの受信を開始するには、PlanetKitConference(カンファレンス中)またはCameraController(プレビューモード、ローカルビデオ専用)インスタンスにレシーバーを登録します。ピアビデオの場合、PeerControl APIを使用することもできます。
ローカルビデオ(プレビューモード)
// Get camera controller instance
PlanetKit::CameraControllerPtr pCameraController = PlanetKit::PlanetKitManager::GetInstance()->GetCameraController();
// Create receiver instance
PlanetKit::IVideoReceiverPtr pMyVideoReceiver = PlanetKit::MakeAutoPtr<VideoFrameReceiver>();
// Start preview with receiver
bool success = pCameraController->StartPreview(pMyVideoReceiver);
if (!success) {
// Handle error
}
ローカルビデオ(カンファレンス中)
// Create receiver instance
PlanetKit::IVideoReceiverPtr pMyVideoReceiver = PlanetKit::MakeAutoPtr<VideoFrameReceiver>();
// Register receiver to get local video during conference
bool success = m_pConference->AddMyVideoReceiver(pMyVideoReceiver);
if (!success) {
// Handle error
}
リモートビデオ(PlanetKitConference使用)
// Create receiver instance
PlanetKit::IVideoReceiverPtr pPeerVideoReceiver = PlanetKit::MakeAutoPtr<VideoFrameReceiver>();
// Create user ID for the target peer
std::wstring strPeerUserId = "peer id";
std::wstring strPeerServiceId = "peer service id";
PlanetKit::UserIdPtr pPeerId = PlanetKit::UserId::Create(strPeerUserId.c_str(), strPeerServiceId.c_str());
// Register receiver to get specific peer's video
bool success = m_pConference->AddPeerVideoReceiver(pPeerID, pPeerVideoReceiver);
if (!success) {
// Handle error
}
リモートビデオ(PeerControl使用)
// Create an instance of PeerControl using PlanetKit::Peer::CreatePeerControl().
// For details, see https://docs.lineplanet.me/windows/getting-started/implement-first-group-video-call#create-a-peercontrol-instance.
PlanetKit::PeerControlPtr pPeerControl;
// Create receiver instance
PlanetKit::IVideoReceiverPtr pPeerVideoReceiver = PlanetKit::MakeAutoPtr<VideoFrameReceiver>();
// Register receiver through peer control
pPeerControl->RegisterReceiver(pPeerVideoReceiver);
ビデオレシーバーの解除
ビデオデータの受信を中止してリソースを整理するには、レシーバーの登録を解除します。
// For local video (preview)
pCameraController->StopPreview();
// For local video (during conference)
m_pConference->RemoveMyVideoReceiver(pMyVideoReceiver);
// For peer video (using PlanetKitConference)
m_pConference->RemovePeerVideoReceiver(pPeerVideoReceiver);
// For peer video (using PeerControl)
pPeerControl->DeregisterReceiver(pPeerVideoReceiver);
関連API
ビデオレシーバー機能とこれに関連するAPIは以下のとおりです。
共通
1対1通話
-
PlanetKitCall::AddMyVideoReceiver() -
PlanetKitCall::RemoveMyVideoReceiver() -
PlanetKitCall::AddPeerVideoReceiver() -
PlanetKitCall::RemovePeerVideoReceiver()