微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么在 MP4/AVC 容器文件中指定了多个时间刻度?

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

  • 在电影标题框 (mvhd) 中:1000
  • 在我的视频轨道 (mdhd) 的媒体标题框中:15360
  • 在序列参数集 NAL 单元的 VUI 部分中更准确地在 AVC 配置框 (avcC) 中: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

解决方法

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

这是电影时间表。用于编辑列表条目的持续时间字段等地方。

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

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

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

那是编码器时基。编码器使用以该时基命名的时间戳用于速率控制目的。这是 ffmpeg 显示的 tbc 值。这是比特流内部的,容器不理会它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。