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