0

我正在使用 VTCompressionSessionEncodeFrameWithOutputHandler 将像素缓冲区从相机压缩到原始 h264 流中。我正在使用 kVTEncodeFrameOptionKey_ForceKeyFrame 来确保 VTCompressionSessionEncodeFrame 的每个输出都不依赖于其他部分。此外,在会话初始化期间还有 kVTCompressionPropertyKey_AllowFrameReordering = false、kVTCompressionPropertyKey_RealTime = true 选项以及在每次 VTCompressionSessionEncodeFrame 调用后调用的 VTCompressionSessionCompleteFrames。

我还收集了由 VTCompressionSessionEncodeFrame 生成的样本,并定期将它们保存为 MP4 文件(使用 Bento4 库)。

但最终音轨总是比样本短,在 1-2 秒内输入 VTCompressionSessionEncodeFrame。经过几次尝试解决这个问题,我可以肯定,它是 VTCompressionSessionEncodeFrame 输出帧,这取决于以后要正确解码的帧 - 所以这些帧会丢失,因为它们不能用于产生轨道的“最终块” .

那么问题来了——如何强制 VTCompressionSessionEncodeFrame 产生完全独立的数据块?

4

1 回答 1

0

原来这是... FPS 问题!NAL 单元本身没有特殊的计时(除了 pts,在我的情况下它是 capture-fps-bound ),所以它们以精确的速率产生是非常重要的,因为电影中的 FPS 期望它们......丢失,刚刚保存的帧播放得更快(事实上,这并不容易发现)

于 2017-08-14T12:33:34.000 回答