【问题标题】:Can you set an arbitrary byte offset in the mp4 header for the first frame?您可以在第一帧的 mp4 标头中设置任意字节偏移量吗?
【发布时间】:2014-05-18 11:47:29
【问题描述】:

TLDR:您能否在第一帧的 mp4 标头中设置任意字节偏移量?

我有一个实用程序的想法,它可以处理已在 goPro 上录制的 mp4 文件,以帮助稍后对齐同时录制的文件。

这个想法的核心是获取一个大文件(数 GB),并从头开始逐帧流式传输,直到找到带有嵌入 QR 码的帧,这将通过指向智能手机或平板电脑上的相机,它正在浏览表示一种时间码的二维码。项目的这一部分相对简单,只需计算帧数。

然后我想做的是备份 mp4 文件的标题,并重写标题,告诉它文件的前 x 帧实际上是未知数据,因此视频内容从第 x 帧开始。 (这样我可以非常快速地对多个文件进行时间对齐,所以当它们被加载到编辑器中时,它们都是相同的时间码。

我不想做的是对整个文件进行转码,理想情况下我希望能够对存储卡上的文件进行转码。

我的问题:给定一个我想称为“第一帧”的帧或字节偏移量,我可以以某种方式调整标题以非破坏性地设置该文件的播放点吗?

【问题讨论】:

    标签: video mp4


    【解决方案1】:

    MP4 文件有其内部结构,字节偏移量根本不是您感兴趣的东西,因为您通常无法指示播放器从特定字节偏移量开始播放。相反,它是从特定时间位置播放。

    在您的情况下,我会考虑识别具有感兴趣代码的帧(从文件开头的时间位置)的第一步。请注意,此位置不一定可从以下位置播放:H.264 编码,典型的 MP4 文件,是时间压缩,播放可能会后退几帧以开始解码/播放。这会威胁到您的 QR 码位于相邻的关键帧之间,但仍然不在其中任何一个上,而且您甚至无法在不重新编码内容(至少部分)的情况下将 QR 码设置为第一个可播放帧。

    知道 QR 码的位置,最简单的方法是简单地将其保存在外部某处,以便稍后查找并开始播放(或提取缩略图)。另一种选择是重新多路复用数据而不重新编码内容以修剪感兴趣位置之前的所有内容(上面段落中的关键帧内容适用于此)。使用适当的工具重新多路复用基本上可以以文件复制的速度进行,并且不会导致质量损失(如果您要使用现有的预构建工具,例如 FFmpeg,这可能是超级用户的问题,而不是 StackOverflow)。

    【讨论】:

    • 我打算做的是使用一个库解压缩每一帧,同时计数,跟踪读取的字节数。当我看到二维码(可能不是实际的二维码,而是针对时间编码优化的东西)时,记下识别代码所需的帧数和字节偏移量。然后我会继续阅读帧直到下一个关键帧,这将是我的参考点。我会在尽可能多的文件上执行此操作,然后选择最接近的匹配项来对齐文件。它不会是绝对完美的,但它会在 1 个关键帧之内。其余的你可以在编辑软件中完成。
    • 我已经看到可以将块标记为“跳过”块。我在想的是在我想要开始播放的关键帧处将第一个视频块分成两部分,并将第一个块称为跳过块。然后视频将从关键帧开始。我将不得不深入研究规范并找出最好的方法。我认为在这里提问将是一个好的开始,以防有人做过类似的事情,或者看到它完成了,并且可以为我指明正确的方向。如果必须,我可以重新发明轮子,只是不愿意。
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多