gpt4 book ai didi

parsing - 为什么我不能让手动修改的 MPEG-4 扩展框( block )大小工作?

转载 作者:行者123 更新时间:2023-12-04 22:59:04 25 4
gpt4 key购买 nike

概述

作为编写 MPEG-4 (MP4) 文件解析器的项目的一部分,我需要了解如何在 MP4 文件中处理扩展框(或 block )大小。当我尝试手动模拟具有扩展框大小的 MP4 文件时,媒体播放器报告该文件无效。

技术资料

释义 MPEG-4 specification :

MP4 文件由一系列称为“盒子”的对象组成。所有数据都包含在框中,文件中没有其他数据。

这是 的屏幕截图第 4.2 节:对象结构 ,它描述了框头及其大小和类型字段:

MPEG-4 Object Structure (part 1)

enter image description here

大多数 MP4 盒头包含两个字段:32 位紧凑盒大小和 32 位盒类型。紧凑的盒子大小支持盒子的数据高达 4 GB。有时,MP4 盒子可能包含比这更多的数据(例如,一个大的视频文件)。在这种情况下,紧凑框大小设置为 1,并在框类型之后立即添加八 (8) 个八位字节。这个 64 位数字被称为“扩展框大小”,并支持最大 2^64 的框大小。

为了更好地理解扩展框大小,我拿了一个简单的 MP4 文件并想修改 moov/trak/mdia box 使用扩展的盒子大小,而不是紧凑的大小。

这是 MP4 文件在修改之前的样子。三个框标题以红色突出显示:

MP4 file before inserting an extended box size

我的计划如下:

  • 修改moov/trak/mdia盒子
  • moov/trak/mdia , 在框类型 ('mdia') 之后插入八 (8) 个八位字节。这最终将是我们扩展的盒子大小。
  • 将紧凑框大小复制到新插入的扩展框大小,将大小加 8 以补偿新插入的八位位组。大小以大端顺序插入。
  • 将压缩大小设置为 1。
  • 修改moov/trak盒子
  • 将 8 添加到现有的紧凑框大小(以补偿添加到 mdia 的八个八位字节)。
  • 修改moov盒子
  • 将 8 加到现有的紧凑框大小(再次,以补偿 mdia 中的八个八位字节)

  • 这是 MP4 文件现在的样子,修改后的八位字节为红色:

    MP4 file after inserting an extended box size

    我们做了什么?

    我们已经告诉 MP4 解析器/播放器使用 moov/trak/mdia来自扩展字段而不是紧凑大小字段的框大小,并将所有父框增加了八 (8) 个,以补偿 mdia 中新插入的扩展框大小盒子。

    有什么问题?

    当我尝试播放修改后的 MP4 文件时,我收到来自不同媒体播放器的错误消息:

    Windows Media Player

    Windows Movies & TV App

    为什么媒体播放器将修改后的文件视为无效的 MP4?
  • 我需要更改任何其他字段吗?
  • 扩展盒大小必须大于 2^32?
  • 是不是只有特定的盒子类型支持扩展的盒子大小(例如,媒体数据)?
  • 最佳答案

    向@Alan Birtles 致敬,他指出 block 偏移量也需要修改。确实,stco (示例表 block 偏移量?)框包含mdat 中数据 block 的绝对文件偏移量。盒子(而不是盒子内的相对偏移量)。这可以在规范文档中看到:

    MPEG-4 Specification for stco box

    block 偏移量需要增加我们在 mdat 之前添加到文件中的八位字节数。盒子。在我们的例子中,这是插入到 mdia 中的八 (8) 个八位字节扩展框大小。盒子。

    剩下的就是手动更改在两个 stco 中找到的 block 偏移量。框(视频和音频轨道),将八 (8) 个添加到每个 block 偏移量。这里是 stco在将 8 添加到它们的 block 偏移之前的框:

    stco box: audio
    stco box: video

    现在该文件通过了ffmpeg 的有效性测试。和 ffprobe工具。有趣的是,尽管 VLC 成功地播放了修改后的文件,但其他媒体播放器(例如,Windows Media Player、MS Photos、MS Movies & TV、MS MovieMaker)报告该文件已损坏。目前尚不清楚他们为什么无法播放该文件。未经证实的可能性包括:

  • 不支持 mdat 以外的任何框的扩展框大小
  • 如果扩展框大小小于 2^32
  • 则停止

    总之,如果将任何字段添加到框(例如,扩展框大小), stco block 偏移量需要增加插入到每个 stco 之前的 MP4 文件中的八位字节数。盒子。

    关于parsing - 为什么我不能让手动修改的 MPEG-4 扩展框( block )大小工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55677945/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com