javascript - 为 Firefox 可以播放的 MP4 构建 ESDS 盒

标签 javascript firefox video mp4 mp4a

我正在生成 MP4 文件(带有 h.264 视频和 AAC 音频),方法是从 JavaScript 中的 MPEG-TS 进行多路传输,以便通过 blob URL 在浏览器中播放。在 Chrome 中一切正常,如果我从开发人员控制台中获取 blob URL 并下载它们,生成的文件在 Windows Media Player 上也可以正常播放。然而,Firefox 声称它们已损坏。

我已将问题缩小为音频元数据中 ESDS 盒的问题。如果我通过其他方式(如 ffmpeg)重新打包源 MPEG-TS 文件,并在十六进制编辑器中手动编辑我生成的文件,将其他软件生成的等效文件粘贴到 ESDS 框中,那么 Firefox 会很高兴。

My code构建 ESDS 盒。 (我正在跟踪 issue )

我试图通过一个非常简单的从 MPEG 规范过程中转录内容来编写它,但这并不能保证我没有搞砸它。由于 Chrome 和 Windows Media 可以很好地播放我的文件,我不确定这是否真的是我的文件中的一个错误,它们以某种方式能够忽略,或者它是否是 Firefox 的问题。我怀疑是前者,但我不确定。

有人对如何构建合适的 ESDS 盒有任何见解,或者可能是直接、易于理解的引用吗?

编辑:这是为同一输入文件生成的一些不同的 ESDS 部分(作为十六进制字节,从我的十六进制编辑器中复制出来):

我的:

00 00 00 27 65 73 64 73 00 00 00 00 03 22 00 00
02 04 14 40 15 00 00 00 00 00 3a f1 00 00 2d e6
05 02 12 10 06 01 02

mpegts :

00 00 00 33 65 73 64 73 00 00 00 00 03 80 80 80
22 00 02 00 04 80 80 80 14 40 15 00 00 00 00 00
00 00 00 00 00 00 05 80 80 80 02 12 10 06 80 80
80 01 02

ffmpeg:

00 00 00 2c 65 73 64 73 00 00 00 00 03 80 80 80
1b 00 02 00 04 80 80 80 0d 40 15 00 00 00 00 01
5f 42 00 00 00 00 06 80 80 80 01 02

奇怪的是,我之前没有注意到,Firefox 会播放带有 ffmpeg 输出的视频,但 Firefox 和 Windows Media 都不会实际播放声音(Chrome 会播放)。不过,Firefox 和 Windows Media 都乐于使用 mpegts 的输出播放带声音的视频。对于我的,Chrome 和 Windows Media 将播放有声视频,但 Firefox 根本不播放,并声称视频已损坏。

最佳答案

好吧,我找到了我自己的问题的答案。在思考我的 ESDS 盒与其他软件生成的那些之间的差异后,很明显最大的差异是这些 0x80 填充字节的存在——每个 ES 描述符标记号后有三个字节。将它们添加进去,其他大部分都排成一行,看起来几乎一样。

我在 MP4 文件的 MPEG 规范或 ISOBMFF 中找不到为什么这些字节应该存在的提及,但添加它们使其工作 - Firefox 不再认为文件已损坏。

关于javascript - 为 Firefox 可以播放的 MP4 构建 ESDS 盒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30998150/

相关文章:

javascript - JSDOM:删除一次嵌套的 block 引用但留下 2+ 嵌套的 block 引用

css - 样式适用于 Firefox 和 IE8,但不适用于 Chrome(居中 vs text-align=left)

iphone - 带有 iPhone 图像框架的 HTML5 视频

javascript - jQuery:click() 执行而不是绑定(bind)

javascript - 如何使用javascript for循环按类名获取元素宽度?

javascript - 使用 Jest JS 测试 JavaScript 中的异步代码时遇到问题

firefox - 为什么 Google 字体不在 Firefox 上缓存?

python - yum 安装 firefox 错误 - libnssutil3.so

r - R 中高清动画视频的最佳实践

c - OpenCV 错误(cvCreateFileCapture())