我正在生成 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/