获取PTS从原料H264 MDAT通过iOS的AVAssetWriter产生(Get PTS fro

2019-07-30 00:34发布

我试图同时读写通过AVAssetWriter书面H.264 MOV文件。 我设法提取单个NAL单元,它们包​​成FFmpeg的AVPackets和使用的ffmpeg它们写入到另一种视频格式。 它的工作原理和所产生的文件播放以及除了播放速度是不正确的。 如何计算从原材料H.264数据正确的PTS / DTS值? 或者,也许存在一些其他的方式,让他们?

以下是我已经试过:

  1. 极限捕获最小/最大帧频为30,假设输出文件将是每秒30帧。 其实它的FPS总是比我设定值以下。 还有,我觉得FPS是不是包与包之间不变。

  2. 记住每个样品撰写的介绍时间戳和假设样本映射一个-to-one的NALU都和应用保存时间戳输出数据包。 这是行不通的。

  3. PTS设置为0或AV_NOPTS_VALUE。 不工作。

从谷歌上搜索一下我的理解是原始H.264数据通常不包含任何定时信息。 它有时可以有内部SEI一些定时信息,但是我用的是文件没有它。 在另一方面,也有一些应用程序做的正是我想要做的,所以我想这是有可能以某种方式。

Answer 1:

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

每个抽样/帧你AVAssetWriter写将映射一对一与VCL的NAL。 如果你正在做的是转换然后有FFmpeg的做所有的繁重。 从一个容器格式到另一个时,会适当地保持定时信息。

通过AVAssetWriter产生的比特流不包含SEI数据。 它仅包含SPS / PPS / I / P帧。 该SPS也不包含VUI或HRD参数。

- 编辑 -

另外,请记住,如果你是从CMSampleBufferRef当时的时基保存PTS的信息可能是从该目标容器的不同。 例如AVFoundation时基为纳秒,以及FLV文件是毫秒。



文章来源: Get PTS from raw H264 mdat generated by iOS AVAssetWriter