HTML5支持更多音视频格式

HTML5引进了新的的<audio>和<video>标签,可以直接播放音频和视频。但是不同浏览器对音频视频的支持格式有所不同。比如Chromium浏览器不支持MP3、MP4格式,而Chrome却支持。根本原因是浏览器内核所依赖的FFmpeg编译开关不一样导致的的。
在Chromium代码工程的生成gn工程的时候加上以上两个值:

就可以让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文件:

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

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

这个的视频格式是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内部已经定义了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

《HTML5支持更多音视频格式》有2个想法

  1. 大哥,所以单纯的在编译时加参数是不够的

    ffmpeg_branding=”Chrome”
    proprietary_codecs=true

    还要修改代码,可是所有其他格式都是修改third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h
    吗?
    我想应该是的,谢谢了,另外方便转载到zzllq.com吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注