我有一个由类型 1(P 帧)、5(I 帧)、7(SPS)和 8(PPS)组成的 H.264/AVC NAL 流。我想将它们写入 .mov 文件而不重新编码。我正在尝试使用它AVAssetWriter
来执行此操作。状态的文档AVAssetWriterInput
:
为 outputSettings 传递 nil 指示输入通过附加的样本,在将它们写入输出文件之前不进行任何处理。例如,如果您要附加已采用所需压缩格式的缓冲区,这将很有用。但是,目前仅在写入 QuickTime 电影文件时才支持直通(即 AVAssetWriter 是使用 AVFileTypeQuickTimeMovie 初始化的)。对于其他文件类型,您必须指定非零输出设置。
我正在尝试从这些 NAL 中创建 CMSampleBuffers 并将它们附加到资产编写器输入中,但是我无法以产生格式良好的 .mov 文件的方式输入数据,而且我在任何地方都找不到任何线索关于如何做到这一点。
到目前为止,我得到的最好结果是以附件 B 字节流格式(按 7 8 5 1 1 1....重复的顺序)传递 NAL,并在 VLC 中播放结果。因此,我知道 NAL 包含有效数据,但由于 .mov 文件没有 avcC 原子并且 mdat 原子填充了附件 B 字节流,QuickTime 不会播放视频。
现在我正在尝试使用 4 字节(由lengthSizeMinusOne
字段指定)长度字段而不是附件 B 分隔符传入 NAL,据我所知,这就是它们应该被打包到 mdat 原子中的方式.
我不知道如何让资产编写者编写 avcC 原子。我添加的每个样本都会被推入 mdat 原子。
有谁知道我如何将原始 H.264 数据传递到配置为通过(nil outputSettings)的 AVAssetWriterInput 并让它生成正确格式的 QuickTime 文件?