音频/ mp4;无法在Chrome和Firefox中播放codecs =“ mp4a.40.2” 这是有趣的部分:更新请参见

问题描述

似乎我想将要在我的网站上流式传输的音频转换为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.

Firefox:

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

这是有趣的部分:

如果我使用audio/aac作为mime-type创建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
                                                             ^^^ 

在使用audio/mp4; codecs="mp4a.40.2"时,Chrome / Firefox不会出现错误,但是音频没有被播放。


请参见

解决方法

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

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

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

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

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

但是,如果您使用类似这样的非标准扩展名,则可能还需要更新Web服务器配置,以便其报告正确的媒体类型。