본문으로 건너뛰기
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 통화

그룹 통화