【问题标题】:OpenTok iOS SDK 2.18.1 screen share quality issueOpenTok iOS SDK 2.18.1 屏幕共享质量问题
【发布时间】:2021-01-25 17:35:24
【问题描述】:

我们正在使用 ReplayKit 获取 CMSSampleBuffers 并将它们转发给 OTVideoCaptureConsumer,在将 ReplayKit 缓冲区调整为 1280x720 或 1024x768 缓冲区后,我们会获得屏幕共享提要,但它总是变得模糊。

在确保我们控制发送到 videoCaptureConsumer 的 FPS 以限制带宽后,我们仍然无法从订阅设备上的媒体路由器接收到高质量的图像。

我们验证了发送到 OpenTok OTVideoCaptureConsumer 的图像是清晰的图像,但生成的流在订阅者端总是很快变得模糊

问题:有没有人想出一种方法来使用 OpenTok iOS SDK 获得干净的 OTPublisher 屏幕共享源,而不管设备的屏幕尺寸如何?

尝试:

  • 发送帧的不同方式:

我尝试使用 CVPixelBuffer 和 OTVideoFrame 发送图像。当没有从相机接收到帧时,sample suggested by OpenTok support 对相机图像使用 CVPixelBuffer 和对黑色图像使用 OTVideoFrame 两种方法。但无论哪种方式,结果流都会变得模糊

  • 不同的格式和大小:

我没有找到任何提及 iOS SDK 预期图像规格的文档。有什么东西可以帮助我们了解支持的图像格式、数据大小限制和支持的分辨率吗?

我尝试将 ReplayKit 缓冲区按原样从我们的应用程序发送到 videoCaptureConsumer,例如:9.7 Pro iPad 的本机屏幕分辨率为 1920x1440,这似乎被 iOS SDK 接受(返回成功),但只呈现黑色订阅者端的屏幕。

我只是没有其他想法

  • ReplayKit 停止发送帧时重新发送最后一帧:

我在 Twilio ReplayKit 示例中看到了这种行为,但是当 ReplayKit 不发送任何帧时,我们是否应该重新发送最后一帧?如果没问题,或者如果我们这样做,媒体路由器是否会正常运行,我没有看到任何文档

PS:我找到了一些参考资料,以防它可能对其他人有所帮助

我在OpenTok's support suggested sample 看到的都是:

  • iOS AVCaptureSession 支持的预设然后转发到 OTVideoCapturer (Custom-Video-Driver/Lets-Build-OTPublisher/Single-Cam-Capturer/TBExampleVideoCapture.m#L255)

  • 黑帧的硬编码大小(Custom-Video-Driver/Lets-Build-OTPublisher/Single-Cam-Capturer/TBExampleVideoCapture.m#L552)

  • 未处理的 CMSampleBuffer 直接转发给 videoCaptureConsumer (Custom-Video-Driver/Lets-Build-OTPublisher/Single-Cam-Capturer/TBExampleVideoCapture.m#L711)

来自 OpenTok 的文档和论坛帖子:

我还发现了一些有助于了解问题所在的其他帖子:

【问题讨论】:

  • 你有任何更新吗?我在最新更新时遇到了同样的问题,并且广播扩展一直在通过内存限制。

标签: ios opentok screensharing


【解决方案1】:

我最终使用 OTVideoFrame 发送图像并使用 DispatchWorkItem 实现重新发送最后一帧逻辑

    // We just received a frame, cancel any retransmit
    self.resetRetransmitTimer()

    let resized = cgImage
    self.checkPixelBufferSize(forImage: resized)
    let ref = self.fillPixelBuffer(withCGImage: resized)
    CVPixelBufferLockBaseAddress(ref, CVPixelBufferLockFlags.readOnly)
    
    self.videoFrame?.format?.pixelFormat = .ARGB
    self.videoFrame?.timestamp = timestamp
    self.videoFrame?.format?.estimatedCaptureDelay = 10
    self.videoFrame?.format?.estimatedFramesPerSecond = self.config.desiredFrameRate
    self.videoFrame?.orientation = .up
    
    self.videoFrame?.clearPlanes()
    self.videoFrame?.planes?.addPointer(CVPixelBufferGetBaseAddress(ref))
    
    self.videoCaptureConsumer?.consumeFrame(self.videoFrame!)
    
    self.lastReplayKitImage = cgImage
    self.lastReplayKitImageTimeStamp = timestamp
    
    CVPixelBufferUnlockBaseAddress(ref, CVPixelBufferLockFlags.readOnly)
    
    self.scheduleRetransmitTimer()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多