一、准备
1、环境要求
- 一台不低于8G内存200G硬盘空间的主机
- Visual Studio 2019 仅安装“使用C++的桌面开发”即可
- Windows 10 SDK 19041
- 英文版的win10
- 文本编辑器Visual Studio Code
- 稳定的梯子
2、系统配置
- 安装vs2019,选择 使用C++的桌面开发 ,同时确保单个组件勾选了 Windows 10 SDK (10.0.19041.0)
- 安装好Windows10 SDK后,需要在控制面板的程序和功能里找到相关软件,右键更改,然后勾选Debugging Tools for Windows,点击Change将下载安装相应功能
- 安装好 vscode ,方便之后的文件编辑
- 将系统语言设置成英文,方法如下:
(1)打开Windows 设置,选择时间和语言
(2)选择区域选项,将国家或地区设置成美国
(3)选择语言选项,点击添加语言,选择英语(美国),下一步勾选设置为我的Windows显示语言
(4)完成语言包的切换后会要求注销账户,根据提示注销
(5)重新登录账户
(6)回到刚才的语言选项,点击管理语言设置
(7)点击更改系统区域设置,选择英语(美国),勾选 Bate 版:使用 Unicode UTF-8 提供全球语言支持 选项
(8)点击确定,按照提示重启系统,重启完成后会将语言设置成英文
- 在D盘新建
CEF_Build
文件夹,之后所有的文件都放到里面
二、下载工具
1、下载工具depot_tools.zip,然后解压到D:\CEF_Build\depot_tools
路径
2、将D:\CEF_Build\depot_tools
添加到环境变量
3、在depot_tools目录下使用cmd执行update_depot_tools.bat
,将会自动安装需要的软件
4、将 automate-git.py 脚本下载到D:\CEF_Build\automate\automate-git.py
三、下载源码
在automate
目录下创建脚本文件update.bat
,写入以下内容:
@echo off
set GN_DEFINES=is_component_build=true
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*
python automate-git.py --download-dir=D:\CEF_Build\chromium_git --depot-tools-dir=D:\CEF_Build\depot_tools --branch=4430 --no-update --no-depot-tools-update --no-distrib --no-build --force-clean
pause
双击运行update.bat
以下载源码
参数说明:
download-dir: 代码下载目录
depot-tools-dir: 工具目录
branch: 要编译的分支,可以参考Current Release Branches (Supported) — Bitbucket
–no-update:不更新Chromium或CEF
–no-depot-tools-update:不更新depot-tools
–no-distrib:不打包
–no-build:不编译
–force-clean:强制清理Chromium和CEF,这将触发一个新的更新、构建和发布
注:更多参数可以使用命令
python automate-git.py --help
查看
四、修改源码
源码修改是在90.6.7.4430
版本上进行的
H.264支持
1、修改D:\CEF_Build\chromium_git\chromium\src\third_party\ffmpeg\chromium\scripts\build_ffmpeg.py
找到configure_flags['Chrome'].extend
,修改为如下
configure_flags['Chrome'].extend([
'--enable-decoder=aac,h264,mp3,mpeg4,amrnb,amrwb,flv',
'--enable-demuxer=aac,mp3,mov,avi,amr,flv',
'--enable-parser=aac,h264,mpegaudio,mpeg4video,h263',
])
configure_flags[‘Chrome’].extend([
‘–enable-decoder=aac,h264,mp3,mpeg4,amrnb,amrwb,flv’,
‘–enable-demuxer=aac,mp3,mov,avi,amr,flv’,
‘–enable-parser=aac,h264,mpegaudio,mpeg4video,h263’,
])configure_flags[‘Chrome’].extend([
‘–enable-decoder=aac,h264,mp3,mpeg4,amrnb,amrwb,flv’,
‘–enable-demuxer=aac,mp3,mov,avi,amr,flv’,
‘–enable-parser=aac,h264,mpegaudio,mpeg4video,h263’,
])
2、修改D:\CEF_Build\chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.h
找到宏#define CONFIG_SIPR_PARSER设置成1
H.265支持
1、修改chromium_git\chromium\src\third_party\ffmpeg\ffmpeg_generated.gni
if ((is_mac) || (is_win) || (use_linux_config)) {
ffmpeg_c_sources += [
"libavcodec/autorename_libavcodec_hpeldsp.c",
"libavcodec/autorename_libavcodec_videodsp.c",
"libavcodec/autorename_libavcodec_vp3dsp.c",
"libavcodec/autorename_libavcodec_vp8dsp.c",
"libavcodec/h264pred.c",
"libavcodec/vp3.c",
"libavcodec/vp3_parser.c",
"libavcodec/vp56rac.c",
"libavcodec/vp8.c",
"libavcodec/vp8_parser.c",
]
ffmpeg_c_sources += [
"libavcodec/bswapdsp.c",
"libavformat/avc.c",
"libavcodec/dynamic_hdr10_plus.c",
"libavcodec/autorename_libavcodec_hevcdec.c",
"libavcodec/hevc_cabac.c",
"libavcodec/hevc_data.c",
"libavcodec/hevc_filter.c",
"libavcodec/hevc_mvs.c",
"libavcodec/hevc_parse.c",
"libavcodec/hevc_parser.c",
"libavcodec/hevc_ps.c",
"libavcodec/hevc_refs.c",
"libavcodec/hevc_sei.c",
"libavcodec/hevcdsp.c",
"libavcodec/hevcpred.c",
"libavcodec/x86/bswapdsp_init.c",
"libavcodec/x86/hevcdsp_init.c",
"libavformat/autorename_libavformat_hevc.c",
"libavformat/hevcdec.c",
]
ffmpeg_asm_sources += [
"libavcodec/x86/bswapdsp.asm",
"libavcodec/x86/hevc_deblock.asm",
"libavcodec/x86/hevc_idct.asm",
"libavcodec/x86/hevc_mc.asm",
"libavcodec/x86/hevc_add_res.asm",
"libavcodec/x86/hevc_sao.asm",
"libavcodec/x86/hevc_sao_10bit.asm",
]
}
2、修改chromium_git\chromium\src\third_party\ffmpeg\ffmpeg_options.gni
# if (is_chrome_branded) {
# _default_ffmpeg_branding = "Chrome"
# } else {
# _default_ffmpeg_branding = "Chromium"
# }
# if (is_chromeos && is_chrome_branded) {
# _default_ffmpeg_branding = "ChromeOS"
# }
# if (is_chromecast) {
# if (is_android) {
# _default_ffmpeg_branding = "Chrome"
# } else {
# # TODO(alokp): What audio codecs does Chromecast want here? Sort
# # out and add configs if necessary. http://crbug.com/570754
# _default_ffmpeg_branding = "ChromeOS"
# }
# }
+ _default_ffmpeg_branding = "Chrome"
3、复制并重命名这个文件里的两个文件 chromium_git\chromium\src\third_party\ffmpeg\
- libavcodec/hevcdec.c => libavcodec/autorename_libavcodec_hevcdec.c
- libavformat/hevc.c => libavformat/autorename_libavformat_hevc.c
4、修改这两个文件,把下面几个的值配成 1:
- chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.asm
- chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.h
define CONFIG_HEVC_DECODER 1
define CONFIG_HEVC_DEMUXER 1
define CONFIG_HEVC_PARSER 1
// 增加下下面的宏
define CONFIG_MP4_DEMUXER 1
5、修改:src\third_party\ffmpeg\chromium\config\Chrome\win\x64\libavcodec\codec_list.c
添加以下内容
&ff_hevc_decoder
6、修改:src\third_party\ffmpeg\chromium\config\Chrome\win\x64\libavcodec\parser_list.c
添加以下内容
&ff_hevc_parser
7、修改:src\third_party\ffmpeg\chromium\config\Chrome\win\x64\libavformat\demuxer_list.c
添加以下内容
&ff_hevc_demuxer
8、修改:chromium_git\chromium\src\build\config\features.gni
# Note: this flag is used by WebRTC which is DEPSed into Chrome. Moving it
# out of //build will require using the build_overrides directory.
# proprietary_codecs = is_chrome_branded || is_chromecast
+ proprietary_codecs = true
9、修改: chromium_git\chromium\src\media\media_options.gni
# Enable HEVC/H265 demuxing. Actual decoding must be provided by the
# platform. Enabled by default for Chromecast, Chrome OS protected media and
# fuzzer builds.
# enable_platform_hevc =
# proprietary_codecs &&
# (is_chromecast || use_chromeos_protected_media || use_fuzzing_engine)
+ enable_platform_hevc = true
10、修改:chromium_git\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")
}
11、修改:chromium_git\chromium\src\media\base\supported_types.cc
bool IsDefaultSupportedVideoType(const VideoType& type) {
//...
switch (type.codec) {
// ....
case kCodecVP9:
// Color management required for HDR to not look terrible.
return IsColorSpaceSupported(type.color_space) &&
IsVp9ProfileSupported(type.profile);
case kCodecH264:
+ case kCodecHEVC:
case kCodecVP8:
case kCodecTheora:
return true;
// case kCodecHEVC:
// #if BUILDFLAG(ENABLE_PLATFORM_HEVC) && BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
// return IsColorSpaceSupported(type.color_space) &&
// IsHevcProfileSupported(type.profile);
// #else
// return false;
// #endif
case kUnknownVideoCodec:
case kCodecVC1:
case kCodecMPEG2:
case kCodecDolbyVision:
return false;
// ...
}
}
注意:
编译了支持HEVC解码的版本后,使用html5test.com测试还是提示不支持H.265,原因如下:
html5test.com 上检测浏览器是否支持HEVC是用 video.canPlayType() 检查以下两种codec是否支持而确定浏览器是否支持H.265的:
video/mp4; codecs="hvc1.1.L0.0"
video/mp4; codecs="hev1.1.L0.0"但是在Chromium源码
media\base\video_codes.cc
中(90.6.7.4430版本):// The specification for HEVC codec id strings can be found in ISO IEC 14496-15
// dated 2012 or newer in the Annex E.3
bool ParseHEVCCodecId(…) { … }给出的codec是:
video/mp4; codecs="hev1.1.2.L93.B0"
video/mp4; codecs="hev1.A4.41.H120.B0.23
这两个值是不符合 ISO IEC 14496-15 规范的(参考Annex E.3),因此会显示不支持。实际上是可以播放HEVC文件的。
这两个codec在macOS Safari 13.0.4上是有效的,可以被识别的。
五、编译
1、生成工程
在automate
目录下创建脚本文件create.bat
,写入以下内容:
@echo off
set GN_DEFINES=proprietary_codecs=true ffmpeg_branding=Chrome is_official_build=true is_debug=false target_cpu=x64 symbol_level=0 enable_nacl=false use_jumbo_build=true
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*
cd ..\chromium_git\chromium\src\cef
call cef_create_projects.bat
pause
双击运行create.bat
将生成工程,生成的路径在D:\CEF_Build\chromium_git\chromium\src\out
GN_DEFINES 参数介绍:
ffmpeg_branding和proprietary_codecs 表示开启多媒体编解码支持,但默认仅支持一小部分,想要支持更多就是修改 ffmpeg 配置。
is_official_build 决定了是否是编译正式版本,指定该参数为 true 基本上都是为了产品发布使用,同时也会在创建解决方案的时候生成带有 sandbox 的解决方案(如 Release_GN_x64_sandbox),而不指定这个参数是没有的。
use_jumbo_build 官方资料默认指定,表示是否启用试验性的 jumbo 编译,编译过程会加快很多(至少快 1 小时),但是占用 CPU 和内存(尤其是内存)会剧增。
is_component_build 官方资料默认指定,但我们没有开启,这个参数表示是否启用组件化编译,设置为 true 以后,base、ffmpeg 等等都会被编译为动态库,使用时也是动态链接,编译出来的 cef_sandbox 只有几兆大小,并且你需要复制很多 dll 文件到项目目录下才能运行。
enable_nacl 禁用本机客户端 大多数开发人员通常不需要测试本机客户端功能,可以通过禁用它来加快构建速度。
symbol_level 设置从 0(无符号或最小符号)到 2(完整符号)不等。较低的级别使调试几乎不可能,但构建速度会快得多。在某些情况下,如果您只想尽快进行构建(许多构建机器人都这样做),它可能很有用
注:详情可以查询官方介绍GN 构建配置 (chromium.org)
2、开始编译
在automate
目录下创建脚本文件build.bat
,写入以下内容:
@echo off
cd ..\chromium_git\chromium\src
echo StartTime %date% %time:~0,2%:%time:~3,2%:%time:~6,2%
ninja -C out\Release_GN_x64 cef
IF ERRORLEVEL 1 goto END
ninja -C out\Release_GN_x64_sandbox cef_sandbox
:END
echo EndTime %date% %time:~0,2%:%time:~3,2%:%time:~6,2%
pause
双击运行build.bat
将进行编译
注意:如果系统里已经安装了python3,需要卸载掉,否则会冲突报错!
3、打包
在automate
目录下创建脚本文件distrib.bat
,写入以下内容:
@echo off
cd ..\chromium_git\chromium\src\cef\tools
call make_distrib.bat --ninja-build --minimal --x64-build
pause
双击运行distrib.bat
将进行打包,打包完成后可以在chromium_git\chromium\src\cef\binary_distrib
下找到打包的文件
4、测试
编译成功后将 libcef.dll 复制出来替换掉就可以,可以使用以下网址判断是否支持 H.264 和 H.265 :
https://mgh.cool:9000/hevctest/index.html
参考链接
- cef / wiki / Windows Setup — Bitbucket
- cef / wiki / Windows Configuration — Bitbucket
- cef / wiki / Current Release Branches (Supported) — Bitbucket
- Windows下编译cef使其支持H.264 – 简书 (jianshu.com)
- CEF3 源码编译支持H264(win) – 知乎 (zhihu.com)
- 修改Chromium源码,实现HEVC/H.265 4K视频播放_前端_SijieCai_InfoQ精选文章
- Chrome 浏览器支持4k/h265的定制开发 (qq.com)
- cef_enhancement/HEVCDecoder at master · epubcn/cef_enhancement (github.com)