我正在生成 MP4 文件(带有 h.264 视频和 AAC 音频),方法是从 JavaScript 中的 MPEG-TS 进行转换,以通过 blob URL 在浏览器中播放。在 Chrome 中一切正常,如果我从开发人员控制台中获取 blob URL 并下载它们,生成的文件也可以在 Windows Media Player 上正常播放。然而,Firefox 声称它们已损坏。
我已将问题缩小到音频元数据中的 ESDS 框的问题。如果我通过其他方式(如 ffmpeg)重新打包源 MPEG-TS 文件,并在十六进制编辑器中手动编辑我生成的文件,以将其他软件生成的等效文件粘贴到 ESDS 框中,那么 Firefox 很高兴。
我试图通过一个非常简单的从 MPEG-specs 中转录材料的过程来编写它,但这并不能保证我没有把它搞砸。由于 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
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 根本不播放,并声称视频已损坏。