问题描述
似乎我想将要在我的网站上流式传输的音频转换为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服务器配置,以便其报告正确的媒体类型。