FFmpeg为什么将ISMV time_base强制为1/10000000?

时间:2019-01-03 19:37:35

标签: video ffmpeg

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

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

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

我发现这与编写pts(表示时间戳)值有关,令人困惑和成问题。我是这个领域的新手,但我的理解是:

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

由于我在使用av_packet_rescale_ts(packet,codec.time_base,stream.time_base)写入数据包pt之前先对其进行缩放,因此会产生较大的pts值。我已读过references,以允许pts在2 ^ 33处翻转。这是处理ISMV时基的正确方法吗?还有我想念的吗?

谢谢!

0 个答案:

没有答案