ビデオレシーバー
ビデオレシーバー機能を使用すると、実際のビデオストリームに影響を与えることなく、ビデオデータを取得できます。アプリケーションでは、この機能を利用してビデオデータのコピーを受け取り、さまざまな用途に使用できます。
| 対応する通話タイプ | SDKの最低バージョン |
|---|---|
| 1対1通話、グループ通話(カンファレンス) | PlanetKit 7.0 |
活用事例
ビデオレシーバーの主な活用例は次のとおりです。
- ビデオ分析と品質のモニタリング
- 通話分析と指標の収集
- サムネイルの作成
実装段階
ビデオレシーバー機能を実装するには、次の手順に従います。
ローカルユーザー向けビデオレシーバー
ローカルユーザー向けビデオレシーバーの実装
ローカルユーザーのビデオデータを受信するためにPlanetKitVideoOutputDelegateを実装するクラスを作成します。
import PlanetKit
class LocalVideoReceiver: NSObject, PlanetKitVideoOutputDelegate {
func videoOutput(_ videoBuffer: PlanetKitVideoBuffer) {
// Access video buffer properties
let sampleBuffer = videoBuffer.sampleBuffer // CMSampleBuffer?: video sample buffer
let timestamp = videoBuffer.timestamp // CMTime: timestamp
let rotation = videoBuffer.rotation // PlanetKitVideoRotation: rotation angle
let position = videoBuffer.position // PlanetKitCameraPosition: camera position
let source = videoBuffer.source // PlanetKitVideoSource: video source
let sender = videoBuffer.sender // PlanetKitUserId?: sender (nil for local user)
// Extract pixel buffer from sample buffer if needed
guard let sampleBuffer = sampleBuffer,
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
// Get video dimensions from pixel buffer
let width = CVPixelBufferGetWidth(pixelBuffer)
let height = CVPixelBufferGetHeight(pixelBuffer)
// Use the video buffer for your use case
// Note: The buffer is only valid during this callback
// Retain the sample buffer if you need it beyond this callback
}
}
ビデオレシーバーの設定
ビデオデータの受信を開始するには、ローカルビデオストリームにビデオレシーバーを登録します。
// For 1-to-1 call
let localReceiver = LocalVideoReceiver()
call.myVideoStream.addReceiver(localReceiver)
// For group call
let localReceiver = LocalVideoReceiver()
conference.myVideoStream.addReceiver(localReceiver)
ビデオレシーバーの解除
ビデオの受信を中止するには、ビデオレシーバーの登録を解除します。
// For 1-to-1 call
call.myVideoStream.removeReceiver(localReceiver)
// For group call
conference.myVideoStream.removeReceiver(localReceiver)
ピア向けビデオレシーバー
ピア向けビデオレシーバーの実装
ピアのビデオデータを受信するためにPlanetKitVideoOutputDelegateを実装するクラスを作成します。
import PlanetKit
class PeerVideoReceiver: NSObject, PlanetKitVideoOutputDelegate {
func videoOutput(_ videoBuffer: PlanetKitVideoBuffer) {
// Access video buffer properties
let sampleBuffer = videoBuffer.sampleBuffer // CMSampleBuffer?: video sample buffer
let timestamp = videoBuffer.timestamp // CMTime: timestamp
let rotation = videoBuffer.rotation // PlanetKitVideoRotation: rotation angle
let position = videoBuffer.position // PlanetKitCameraPosition: camera position
let source = videoBuffer.source // PlanetKitVideoSource: video source
let sender = videoBuffer.sender // PlanetKitUserId?: sender (identifies the peer)
// Extract pixel buffer from sample buffer if needed
guard let sampleBuffer = sampleBuffer,
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
// Get video dimensions from pixel buffer
let width = CVPixelBufferGetWidth(pixelBuffer)
let height = CVPixelBufferGetHeight(pixelBuffer)
// Use the video buffer for your use case
// Note: The buffer is only valid during this callback
// Retain the sample buffer if you need it beyond this callback
}
}
ビデオレシーバーの設定
1対1通話とグループ通話ではアプローチが異なります。
1対1通話の場合
ピアのビデオストリームにビデオレシーバーを登録します。
let peerReceiver = PeerVideoReceiver()
call.peerVideoStream.addReceiver(peerReceiver)
グループ通話の場合
特定のピアのビデオを受信するには、PlanetKitPeerControlのstartVideo()をビデオレシーバーと共に呼び出します。
// Create the peer control instance for the target peer
guard let peerControl = conference.createPeerControl(peer: peer) else {
print("Failed to create peer control")
return
}
// Create receiver instance
let peerReceiver = PeerVideoReceiver()
// Start receiving video with specified maximum resolution
peerControl.startVideo(
maxResolution: .vga640x480,
delegate: peerReceiver,
subgroupName: nil
) { success in
if success {
print("Successfully started receiving peer video")
} else {
print("Failed to start receiving peer video")
}
}
// Alternative: Use the callback with resolution details
peerControl.startVideo(
maxResolution: .vga640x480,
delegate: peerReceiver,
subgroupName: nil
) { success, requestedResolution, receivedResolution, failReason in
if success {
print("Started receiving peer video")
print("Requested resolution: \(requestedResolution)")
print("Actual resolution: \(receivedResolution)")
} else {
print("Failed to start receiving peer video: \(failReason)")
}
}
ビデオレシーバーの解除
1対1通話の場合
ピアのビデオストリームでビデオレシーバーの登録を解除します。
call.peerVideoStream.removeReceiver(peerReceiver)
グループ通話の場合
ピアからのビデオ受信を中止するには、PlanetKitPeerControlのstopVideo()を呼び出します。
peerControl.stopVideo { success in
if success {
print("Successfully stopped receiving peer video")
} else {
print("Failed to stop receiving peer video")
}
}
関連API
ビデオレシーバー機能とこれに関連するAPIは以下のとおりです。
共通
-
PlanetKitVideoOutputDelegate -
PlanetKitVideoStream -
PlanetKitVideoStreamのaddReceiver(_:) -
PlanetKitVideoStreamのremoveReceiver(_:)