本文にスキップする
Version: 7.0

ビデオレシーバー

ビデオレシーバー機能を使用すると、実際のビデオストリームに影響を与えることなく、ビデオデータを取得できます。アプリケーションでは、この機能を利用してビデオデータのコピーを受け取り、さまざまな用途に使用できます。

対応する通話タイプ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通話

グループ通話