gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:55:17 24 4
gpt4 key购买 nike

我正在尝试同时读取和写入由 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 中包含一些时间信息,但我使用的文件没有。另一方面,有一些应用程序完全可以做我想做的事情,所以我想这在某种程度上是可能的。

最佳答案

您必须自己生成它们,或者访问 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 文件是毫秒。

关于ios - 从 iOS AVAssetWriter 生成的原始 H264 mdat 获取 PTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11087676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com