首页 > 解决方案 > 为什么 FFmpeg 强制 ISMV time_base 为 1/10000000?

问题描述

我正在使用 FFmpeg 内部 API 使用 isvm muxer 将音频和视频捕获到文件中。

在写入文件头之前,音频 ACC 流 time_base 设置为 1/44100,视频 h264 流 time_base 设置为 1/30。尽管有这些设置,调用 avformat_write_header(oc, options),ffmpeg 在内部强制两个流的 time_base 为 1/10000000。查看avformat_write_header的内部源代码,可以看到调用了 AVFormatContext 的延迟初始化。对于 mp4 和 ismv,惰性初始化将调用mov_init。但是,由于 ismv 具有 mov->mode == MODE_ISM,它会覆盖任何值为 1/10000000 的流 time_base,如mov_init 中的第 6230 行所示。另一方面,mp4 允许流保持与相关编解码器配置一致的时基。

当向 ffmpeg 添加 ISMV 支持时,添加了仅允许单个时基的逻辑。有谁知道为什么这是必要的(除了支持代码注释中所述的 mp4split 工具)?

我发现这与写入 pts(表示时间戳)值有关,因此令人困惑且有问题。我对这个领域比较陌生,但我的理解是:

  1. 时基以每秒单位表示。这意味着对于 ISMV,pts=1 的值为 0.1 微秒。
  2. ISMV 中支持的最大 pts 值为 2^33 或 8589934592。这将最大 pts 限制为大约 859 秒。

由于我在使用 av_packet_rescale_ts(packet, codec.time_base, stream.time_base) 编写数据包点之前缩放我的数据包点,这会导致点的值很大。我已阅读有关允许 pts 在 2^33 处翻转的参考资料。这是处理 ISMV 时基的正确方法吗?还有什么我想念的吗。

提前致谢!

标签: videoffmpeg

解决方案


推荐阅读