비디오 리시버
비디오 리시버 기능을 이용하면 실제 비디오 스트림에 영향을 주지 않고 비디오 데이터를 얻을 수 있습니다. 애플리케이션에서는 이 기능을 이용해 비디오 데이터의 복사본을 받아 다양한 용도로 사용할 수 있습니다.
| 지원되는 통화 유형 | 최소 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(_:)