为什么 MP4/AVC 容器文件中指定多个时间刻度?

Lex*_*117 3 mp4 ffmpeg timing video-streaming mpeg-dash

我当前正在解析 MPEG-DASH 流初始化段(由 FFMPEG 生成),我注意到时间刻度是在我的文件中的多个不同位置指定的:

  • 在电影标题框中(mvhd):1000
  • 在我的视频轨道(mdhd)的媒体标题框中:15360
  • 在 AVC 配置框 (avcC) 中,更准确地说,在序列参数集的 VUI 部分中 NAL 单位:60

为什么在这么多不同的地方指定它?为什么他们有不同的价值观?这些价值有等级吗?例如,60 是否会覆盖 15360,15360 是否会覆盖 1000?

这是我用来生成我正在查看的文件的命令:

ffmpeg -f v4l2 -pixel_format yuyv422 -vcodec rawvideo -framerate 30 -video_size 640x360 -i /dev/video0 \
        -f dash -remove_at_exit false -use_template true -use_timeline true -streaming true -window_size 5 -extra_window_size 5 -seg_duration 5 -vcodec libx264 -b:v 1M -maxrate 1M -bufsize 2M  -pix_fmt yuv420p -r 30 -s 640x360 -aspect 16:9 /var/www/html/media/live.mpd
Run Code Online (Sandbox Code Playgroud)

Gya*_*yan 5

在电影标题框中(mvhd):1000

这是电影的时间表。它用于诸如编辑列表条目的持续时间字段之类的地方。

在我的视频轨道(mdhd)的媒体标题框中:15360

这是轨道时间刻度。这用于编辑列表条目中的示例时间戳字段以及 stts、stss、ctts 框中的持续时间字段。ffmpeg(和其他应用程序)将根据此时间刻度生成时间戳。

在 AVC 配置框 (avcC) 中,更准确地说,在序列参数集的 VUI 部分中 NAL 单位:60

这就是编码器时基。编码器使用以此时基命名的时间戳来进行速率控制。这是 ffmpeg 显示的 tbc 值。这是比特流内部的,容器不关心它。