前言
网上有资料,讲如何添加h264到chromium.
不过,他们都没说到当时实验的chromium版本。有的资料和手头的chromium版本对不上。
第一波做实验的大神从哪找的资料?很好奇。
实验
实验环境
chromium68.0.3440.84 + depot_tools + vs2017 + win10x64
实验效果
通过添加编译标志,不用改代码, 实现增加h264的功能(h264代码工程里有)。
测试用例:拖动一个mp4文件到编译好的chromium浏览器。
添加h264之前,不能播放mp4图像,只能听声音。
添加h264成功之后,可以播放mp4, 能看到图像动画和听到声音。
参考资料
https://www.chromium.org/developers/gn-build-configuration
https://blog.csdn.net/Vincent95/article/details/78477822
实验开始
建立配置文件
直接用命令行也行,那样要写的好长,如果有错误,不好排查,也不好写注释
Z:\chromium\src\out\default_x86_r\args.gn
# @file Z:\chromium\src\out\default_x86_r\args.gn
# @brief build chromium x86 release version
# @ref https://www.chromium.org/developers/gn-build-configuration
# https://blog.csdn.net/Vincent95/article/details/78477822
# @note
# cd Z:\chromium\src\
# gn --ide=vs args out\default_x86_r
# autoninja -C out\default_x86_r chrome
#
#
# args.gn begin
#
target_os = "win"
target_cpu = "x86"
# is_component_build只能是false, 否则编译不过
is_component_build = false
dcheck_always_on = true
enable_nacl = false
symbol_level = 0
is_debug = false
remove_webcore_debug_symbols = true
# proprietary_codecs 和 media_use_ffmpeg 不兼容, 只能定义一个
# proprietary_codecs = true
media_use_ffmpeg = true
rtc_initialize_ffmpeg = true
rtc_use_h264 = true
use_openh264 = true
ffmpeg_branding = "Chrome"
#
# args.gn end
#
is_component_build只能是false
如果不是false, 会报错如下。
报错原因,调用了一个dll中的内部函数。
如果静态编译就没这个问题
[3126/3204] LINK(DLL) content.dll content.dll.lib
FAILED: content.dll content.dll.lib
Z:/depot_tools/win_tools-2_7_6_bin/python/bin/python.exe ../../build/toolchain/win/tool_wrapper.py link-wrapper environment.x86 False ../../third_party/llvm-build/Release+Asserts/bin/lld-link.exe /nologo /IMPLIB:./content.dll.lib /DLL /OUT:./content.dll /PDB:./content.dll.pdb @./content.dll.rsp
Z:\chromium\src\third_party\llvm-build\Release+Asserts\bin\lld-link.exe: error: undefined symbol: _av_lockmgr_register
>>> referenced by webrtc_h264.lib(h264_decoder_impl.obj):(?InitDecode@H264DecoderImpl@webrtc@@UAEHPBVVideoCodec@2@H@Z)
Z:\chromium\src\third_party\llvm-build\Release+Asserts\bin\lld-link.exe: error: undefined symbol: _av_register_all
>>> referenced by webrtc_h264.lib(h264_decoder_impl.obj):(?InitDecode@H264DecoderImpl@webrtc@@UAEHPBVVideoCodec@2@H@Z)
ninja: build stopped: subcommand failed.
只能定义 media_use_ffmpeg为true
BUILD.gn中有句断言, 不让proprietary_codecs和media_use_ffmpeg同时为真。
看到断言的原因后,在配置文件中加了一句
ffmpeg_branding = “Chrome”
同时不定义proprietary_codecs = true
Z:\chromium\src\media\BUILD.gn
if (proprietary_codecs && media_use_ffmpeg) {
assert(
ffmpeg_branding != "Chromium",
"proprietary codecs and ffmpeg_branding set to Chromium are incompatible")
}
生成工程
cd Z:\chromium\src
gn --ide=vs args out\default_x86_r
查看确认h264相关的编译开关值
只有这些值是正确的,才能开始编译
gn args out\default_x86_r --list=is_component_build
is_component_build
Current value = false
From //out/default_x86_r/args.gn:15
Overridden from the default = false
From //build/config/BUILDCONFIG.gn:165
Component build. Setting to true compiles targets declared as "components"
as shared libraries loaded dynamically. This speeds up development time.
When false, components will be linked statically.
For more information see
https://chromium.googlesource.com/chromium/src/+/master/docs/component_build.md
Z:\chromium\src>gn args out\default_x86_r --list=proprietary_codecs
proprietary_codecs
Current value (from the default) = false
From //build/config/features.gni:29
Enables proprietary codecs and demuxers; e.g. H264, AAC, MP3, and MP4.
We always build Google Chrome and Chromecast with proprietary codecs.
Note: this flag is used by WebRTC which is DEPSed into Chrome. Moving it
out of //build will require using the build_overrides directory.
Z:\chromium\src>gn args out\default_x86_r --list=media_use_ffmpeg
media_use_ffmpeg
Current value = true
From //out/default_x86_r/args.gn:26
Overridden from the default = true
From //media/media_options.gni:38
Enable usage of FFmpeg within the media library. Used for most software
based decoding, demuxing, and sometimes optimized FFTs. If disabled,
implementors must provide their own demuxers and decoders.
Z:\chromium\src>gn args out\default_x86_r --list=rtc_initialize_ffmpeg
rtc_initialize_ffmpeg
Current value = true
From //out/default_x86_r/args.gn:27
Overridden from the default = false
From //third_party/webrtc/webrtc.gni:150
FFmpeg must be initialized for |H264DecoderImpl| to work. This can be done
by WebRTC during |H264DecoderImpl::InitDecode| or externally. FFmpeg must
only be initialized once. Projects that initialize FFmpeg externally, such
as Chromium, must turn this flag off so that WebRTC does not also
initialize.
Z:\chromium\src>gn args out\default_x86_r --list=rtc_use_h264
rtc_use_h264
Current value = true
From //out/default_x86_r/args.gn:28
Overridden from the default = false
From //third_party/webrtc/webrtc.gni:129
Enable this to build OpenH264 encoder/FFmpeg decoder. This is supported on
all platforms except Android and iOS. Because FFmpeg can be built
with/without H.264 support, |ffmpeg_branding| has to separately be set to a
value that includes H.264, for example "Chrome". If FFmpeg is built without
H.264, compilation succeeds but |H264DecoderImpl| fails to initialize. See
also: |rtc_initialize_ffmpeg|.
CHECK THE OPENH264, FFMPEG AND H.264 LICENSES/PATENTS BEFORE BUILDING.
http://www.openh264.org, https://www.ffmpeg.org/
Z:\chromium\src>gn args out\default_x86_r --list=use_openh264
use_openh264
Current value = true
From //out/default_x86_r/args.gn:29
Overridden from the default = false
From //third_party/openh264/openh264_args.gni:11
Enable this to build OpenH264 (for encoding, not decoding).
CHECK THE OPENH264 LICENSE/PATENT BEFORE BUILDING, see
http://www.openh264.org/.
Z:\chromium\src>gn args out\default_x86_r --list=ffmpeg_branding
ffmpeg_branding
Current value = "Chrome"
From //out/default_x86_r/args.gn:30
Overridden from the default = "Chromium"
From //third_party/ffmpeg/ffmpeg_options.gni:34
Controls whether we build the Chromium or Google Chrome version of FFmpeg.
The Google Chrome version contains additional codecs. Typical values are
Chromium, Chrome, and ChromeOS.
修改配置文件config.h
Z:\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win-msvc\ia32\config.h
#define CONFIG_H264_DECODER 1
查看确认ffmpeg的配置文件
Z:\chromium\src\third_party\ffmpeg\ffmpeg_generated.gni
可以看到有is_win标记 && ffmpeg_branding = "Chrome", ffmpeg的源码就会被编译.
编译工程
autoninja -C out\default_x86_r chrome
只有is_component_build = false,才能编译的过.
遗留问题
h264加上了, mp4也能看了。
在加h264之前, 设置好flash, 百度和QQ视频也能看。那些视频都是flash.
但是去看u酷时,显示浏览器版本低,不能看。
用同版本号的chrome官方版本,是可以看u酷的。有时间再查资料。
问题解决-2018-0909-1747
在资料的过程中,找到一个浏览器视频格式支持检测页面。
检测页面url => https://www.youtube.com/html5/
用这个检测页面,检测了手头现有的几个浏览器
被检测浏览器 - Win10的IE11
HTMLVideoElement
Media Source Extensions
H.264
MSE & H.264
被检测浏览器 - 官方版chrome68
HTMLVideoElement
Media Source Extensions
H.264
MSE & H.264
WebM VP8
MSE & WebM VP9
被检测浏览器 - chromium68 - 自己编译修改的版本
HTMLVideoElement
Media Source Extensions
WebM VP8
MSE & WebM VP9
这才发现,自己加入的其实是ffmpeg支持,而不是h264支持。
再去查资料,发现编译开关整错了。
只要在Z:\chromium\src\out\default_x86_r\args.gn中,将proprietary_codecs打开,将media_use_ffmpeg关闭, 再产生工程,再build一次就搞定。
proprietary_codecs = true
# media_use_ffmpeg = true
完整的Z:\chromium\src\out\default_x86_r\args.gn内容如下:
# @file Z:\chromium\src\out\default_x86_r\args.gn
# @brief build chromium x86 release version
# @ref https://www.chromium.org/developers/gn-build-configuration
# https://blog.csdn.net/Vincent95/article/details/78477822
# @note
# cd Z:\chromium\src\
# gn --ide=vs args out\default_x86_r
# autoninja -C out\default_x86_r chrome
#
#
# args.gn begin
#
target_os="win"
target_cpu = "x86"
is_component_build = false
dcheck_always_on = true
enable_nacl = false
symbol_level = 0
is_debug = false
remove_webcore_debug_symbols = true
# proprietary_codecs 和 media_use_ffmpeg 不兼容, 只能定义一个
proprietary_codecs = true
# media_use_ffmpeg = true
rtc_initialize_ffmpeg = true
rtc_use_h264 = true
use_openh264 = true
ffmpeg_branding = "Chrome"
#
# args.gn end
#