add h264 to chromium

前言

网上有资料,讲如何添加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
#

猜你喜欢

转载自blog.csdn.net/LostSpeed/article/details/82432738