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

kol*_*hiy 6 ffmpeg avfoundation h.264 ios 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.不行.

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

Ste*_*lin 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文件是毫秒.