【问题标题】:AVCaptureVideoDataOutput and AVCaptureAudioDataOutput same queueAVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 同一个队列
【发布时间】:2019-11-18 19:00:35
【问题描述】:

Apple 最近的示例代码之一使用相同的串行队列从 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 委托接收样本。从性能的角度来看,我需要知道这是否是可接受的做法。两个样本缓冲区代表应该有不同的队列还是单个队列?尤其是在设置多个摄像头输入/输出时,这一点变得很重要。

 private let dataOutputQueue = DispatchQueue(label: "data output queue")
 ...
 ...
 videoDataOutput.setSampleBufferDelegate(self, queue: dataOutputQueue)
 audioDataOutput.setSampleBufferDelegate(self, queue: dataOutputQueue)

【问题讨论】:

    标签: ios avfoundation avcapturesession avcapturedevice avcapturevideodataoutput


    【解决方案1】:

    我猜在性能方面:

    1. 这始终取决于您的情况。也许对于 Apple 的样本来说还可以,但也许在你的情况下它确实需要更多。
    2. 您可以自己尝试一下。尝试在最慢的设备上获取尽可能多的输入,看看性能是否仍然足够好。

    有一个类似的问题,由于串行队列,性能不佳,答案是使用并发队列,请参见此处: Performance issues when using AVCaptureVideoDataOutput and AVCaptureAudioDataOutput

    但我还是建议你尝试一下,看看什么对你有用:)

    更新

    这是一个完美地解释了差异以及如何使用串行和并发队列的链接: https://www.avanderlee.com/swift/concurrent-serial-dispatchqueue/

    【讨论】:

    • 我看到了那个问题,但这个答案的奇怪之处在于使用并发队列。然而,AVCaptureVideoDataOutput 文档 (developer.apple.com/documentation/avfoundation/…) 指定仅使用串行队列。
    • 他们说的是这样的:“你必须使用串行调度队列,以保证视频帧将按顺序传送。”他们说这主要是因为句子的最后一部分 -> 以确保框架的顺序正确。但是您在谈论多个相机输入。如果您只是为每个相机输入使用串行队列,它仍然可以。另外,我刚刚用并发队列的链接更新了我的答案。
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 2017-11-18
    • 2011-04-27
    • 2012-12-06
    • 2020-04-22
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多