chromium HTML5支持更多音视频格式

HTML5引进了新的的

ffmpeg_branding="Chrome"
proprietary_codecs=true

持更多音视频格式 HTML5引进了新的的

ffmpeg_branding="Chrome" proprietary_codecs=true 1 2 ffmpeg_branding="Chrome" proprietary_codecs=true 就可以让Chromium编译出来的浏览器像Chrome一样支持MP3、MP4格式格式了。 proprietary_codecs的作用是开启代码中的USE_PROPRIETARY_CODECS宏,使Chromium的代码支持更多的音视频解码格式。ffmpeg_branding则是作用于Chromium所依赖的第三方ffmpeg工程的代码,使之编译相关的支持代码。 Chromium的音视频解码是调用的第三方库ffmpeg。ffmpeg几乎支持所有的音视频格式,那么Chromium理论上也是可以支持所有的音视频格式的能力。实际上由于ffmpeg这个库很大,为了优化浏览器的体积,Chromium只编译链接了它所需要支持格式的相关代码,只占整个ffmpeg很小的一部分。 我以3GP格式为例,介绍如何让Chromium内核的video标签支持更多视频格式。 我们先编写一个测试3gp格式视频的html文件:

<!DOCTYPE html> 
<html> 
<body> 
<video controls>
  <source src="C:\\Users\\john\\Desktop\\test.3gp" type="video/3gpp">
</video>
</body> 
</html>

然后在MimeUtil::AddSupportedMediaFormats里面添加如下2行:

CodecSet tgpp_codecs(mp4_codecs);
AddContainerWithCodecs("video/3gpp", tgpp_codecs, true);

这是让浏览器能够识别Video标签中的video/3gpp。 3gp只是视频的容器格式,实际上的音频和视频的编解码器是有多种可能的。通过工具查看这个test.3gp的音频格式,如下: chromium html5 video

这个的视频格式是mpeg4,是Chromium内核默认所不支持的。而音频格式是aac,Chromium内核默认支持。所以为了支持这个浏览器播放这个3gp文件,只需要添加mepg4的解码器相关的代码即可。所以我们修改一下Chromium代码编译ffmpeg的开关。 因为之前我们已经把ffmpeg_branding设置成”Chrome”,因此我们的的配置文件是third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h。 在这个config.h里面搜索关键词MPEG4,找到了#define CONFIG_MPEG4_DECODER 0,然后我们把这个宏的值改成#define CONFIG_MPEG4_DECODER 1。然后找到相关的依赖diamond加入到third_party\ffmpeg\ffmpeg_generated.gni中恰当的位置。重新生成工程编译代码即可。最后效果如下图:

chromium html5 video 2

幸运的是Chromium内部已经定义了mpeg4。如果是h263视频编解码,我们还需要往Chromium里面加入相关的编解码器定义。另外编译ffmpeg代码有很多依赖。因此我写了一个脚本来分析configure文件,找到相关的select依赖,然后来开启third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h文件里面的宏定义。最后再根据宏定义来分析makefile文件里面源代码的依赖。最后把这些源代码加到ffmpeg_generated.gni中。

在third_party\ffmpeg\chromium\scripts目录下面,Chrome团队有个build_ffmpeg.py的脚本,通过cygwin交叉编译,然后分析文件来生成ffmpeg_generated.gni文件中的内容。可惜因为这个Chromium的ffmpeg代码很久没有变动了,从gyp升级到gn,相关的脚本已经过时不能用了,也无人维护。这篇文档是说明Chromium升级ffmpeg的文档:https://docs.google.com/document/d/14bqZ9NISsyEO3948wehhJ7wc9deTIz-yHUhF1MQp7Po/edit