我正在使用 VTCompressionSessionEncodeFrameWithOutputHandler 将像素缓冲区从相机压缩到原始 h264 流中。我正在使用 kVTEncodeFrameOptionKey_ForceKeyFrame 来确保 VTCompressionSessionEncodeFrame 的每个输出都不依赖于其他部分。此外,在会话初始化期间还有 kVTCompressionPropertyKey_AllowFrameReordering = false、kVTCompressionPropertyKey_RealTime = true 选项以及在每次 VTCompressionSessionEncodeFrame 调用后调用的 VTCompressionSessionCompleteFrames。
我还收集了由 VTCompressionSessionEncodeFrame 生成的样本,并定期将它们保存为 MP4 文件(使用 Bento4 库)。
但最终音轨总是比样本短,在 1-2 秒内输入 VTCompressionSessionEncodeFrame。经过几次尝试解决这个问题,我可以肯定,它是 VTCompressionSessionEncodeFrame 输出帧,这取决于以后要正确解码的帧 - 所以这些帧会丢失,因为它们不能用于产生轨道的“最终块” .
那么问题来了——如何强制 VTCompressionSessionEncodeFrame 产生完全独立的数据块?