audio/mp4; codecs="mp4a.40.2" 无法在 Chrome 和 Firefox 中播放

audio/mp4; codecs="mp4a.40.2" not playing in Chrome and Firefox

我似乎想将要在我的网站上流式传输的音频转换为 audio/mp4; codecs="mp4a.40.2"

使用 ffmpeg-cli-wrapper,我在这里使用此命令转换我上传的音频文件:

ffmpeg -i /tmp/input.any -acodec aac -b:a 256000 /tmp/output.aac

在客户端上,我正在创建这样一个 SourceBuffer:

this.sourceBuffer = this.mediaSource.addSourceBuffer('audio/mp4; codecs="mp4a.40.2"');

错误是:

Chrome:

NotSupportedError: Failed to load because no supported source was found.

火狐:

NotSupportedError: The media resource indicated by the src attribute or assigned media provider object was not suitable.

有趣的部分来了:

如果我使用 audio/aac 作为 mime 类型创建 SourceBuffer:

this.sourceBuffer = this.mediaSource.addSourceBuffer('audio/aac');

音频在 Chrome 上可以正确播放,但 Firefox 显示:

MediaSource.addSourceBuffer: Type not supported in MediaSource

更新

将命令更改为

ffmpeg -i /tmp/input.any -acodec aac -b:a 256000 /tmp/output.mp4
                                                             ^^^ 

Chrome/Firefox使用audio/mp4; codecs="mp4a.40.2"时不报错,但没有播放音频


在您的 ffmpeg 命令中,使用扩展名 .m4a(或 .mp4),而不是 .aac:

ffmpeg -i /tmp/input.any -acodec aac -b:a 256000 /tmp/output.m4a

.aac 扩展用于 ADTS 容器中的 AAC,这不是网络上广泛使用或支持的格式。 .m4a.mp4 扩展名用于 MP4 容器中的 AAC,这更常见。

或者,如果出于某种原因你真的希望文件被命名为 output.aac 但又希望它在 MP4 中包含 AAC,那么你可以指定输出格式而不是让 ffmpeg 猜测你的格式想要基于输出文件扩展名:

ffmpeg -i /tmp/input.any -acodec aac -b:a 256000 -f mp4 /tmp/output.aac

但是,如果您使用这样的 non-standard 扩展程序,那么您可能还需要更新您的网络服务器配置,以便它报告正确的媒体类型。

我遇到了类似的问题,如果直接用作视频标签内的 src,我的 fMP4 可以正常播放,但通过 MediaSource Extensions 使用时却无法播放。我的问题是我在 fMP4 中的 AAC 帧是使用 ADTS header 并且 MSE 似乎不喜欢那些 header。因此,我从每个 AAC 帧中删除了 ADTS header,它工作正常。 (我已经在我的 ESDS 盒中添加了音频特定配置,因此我可以毫无问题地删除 ADTS header。)