从iOS AVAssetWriter生成的原始H264 mdat获取PTS

时间:2012-06-18 17:07:26

标签: ios ffmpeg avfoundation h.264 avassetwriter

我正在尝试同时读写由AVAssetWriter编写的H.264 mov文件。我设法提取单个NAL单元,将它们打包到ffmpeg的AVPackets中,并使用ffmpeg将它们写入另一种视频格式。它的工作原理和生成的文件播放效果很好,但播放速度不正确。如何从原始H.264数据计算正确的PTS / DTS值?或者也许还有其他方法来获取它们?

这是我尝试过的:

  1. 将捕获最小/最大帧速率限制为30,并假设输出文件为30 fps。事实上,它的fps总是小于我设定的值。而且,我认为fps在数据包之间并不是一成不变的。

  2. 记住每个书面样本的演示文稿时间戳,并假设样本一对一映射到NALU并将保存的时间戳应用于输出数据包。这不起作用。

  3. 将PTS设置为0或AV_NOPTS_VALUE。不起作用。

  4. 从谷歌搜索我了解原始H.264数据通常不包含任何时间信息。它有时在SEI中有一些时间信息,但我使用的文件没有它。另一方面,有些应用程序正是我正在尝试做的,所以我认为它可能以某种方式。

1 个答案:

答案 0 :(得分:5)

您必须自己生成它们,或者访问包含MP4 / MOV容器中的定时信息的Atom,以生成PTS / DTS信息。在libavformat中FFmpeg的mov.c可能有所帮助。

使用AVAssetWriter编写的每个样本/帧都将与VCL NAL一对一映射。如果您所做的只是转换,那么让FFmpeg做所有繁重的工作。当从一种容器格式转换到另一种容器格式时,它将正确地保持定时信息。

AVAssetWriter生成的比特流不包含SEI数据。它只包含SPS / PPS / I / P帧。 SPS也不包含VUI或HRD参数。

- 编辑 -

另外,请记住,如果要从CMSampleBufferRef中保存PTS信息,则时基可能与目标容器的时基不同。例如,AVFoundation时基是纳秒,FLV文件是毫秒。