【问题标题】:Why are there multiple timescale specified in a MP4/AVC container file?为什么在 MP4/AVC 容器文件中指定了多个时间刻度?
【发布时间】:2021-09-08 03:20:11
【问题描述】:

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

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

【问题讨论】:

    标签: ffmpeg video-streaming mp4 timing mpeg-dash


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,现在清楚多了!那么,跟踪片段标头(tfhd) - 默认样本持续时间和跟踪片段解码时间(tfdt)基本媒体解码时间呢?我假设它们是基于轨道时间尺度的?
    • 基于赛道时间尺度。
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2018-09-27
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多