VTCompressionSessionEncodeFrame:最后几秒丢失了吗?

VTCompressionSessionEncodeFrame: last seconds are lost?

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

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

但最终轨道总是比样本短,在 1-2 秒内馈送到 VTCompressionSessionEncodeFrame。经过几次尝试解决这个问题,我可以肯定,这就是 VTCompressionSessionEncodeFrame 输出帧,这取决于后面的帧是否被正确解码 - 所以这些帧丢失了,因为它们不能用于产生 "final chunks"追踪.

所以问题 - 如何强制 VTCompressionSessionEncodeFrame 产生完全独立的数据块?

原来这是... FPS 问题! NAL 单元本身没有特殊的时间(除了 pts,在我的例子中它是捕获 fps 绑定的),所以它们以准确的速率生产是非常重要的,因为电影中的 FPS 期望它们是......没有什么是丢失,只是保存的帧播放得更快(事实上,这并不容易发现)