最近由于项目需要播放h264编码的视频,但是之前使用的Chromium Embedded Framework.framework是从官方下载的(官网下载地址:https://cef-builds.spotifycdn.com/index.html),官方版本默认不支持h264。通过google,百度得知需要修改源码中ffmpeg的配置。本来打算下载大家编译好的直接使用,奈何网上全是windows版本,并且版本号相对偏旧(我原来使用的是87.1.11+g8bb7705+chromium-87.0.4280.66),只能自己下载源码编译,下面就记录一下编译历程,本次编译的源码是90.6.5+g7a604aa+chromium-90.0.4430.93版本。
编译前准备
电脑配置越高越好了,决定了编译时间,磁盘空间最好是100G以上,
安装 git 与 python 工具;
稳定的V*N,用来下载 chromium 源码,源码大小在 45G 左右,稳定性非常重要;
根据官方文档BranchesAndBuilding.md和版本号4430找到对应的环境要求,macOS 10.15.4+,Xcode 12.2(个人建议最好是使用要求的版本,否则可能会出现一些奇怪的问题。附上下载不同版本的地址:https://developer.apple.com/download/more/)
-
代理配置
注意地址换成自己的代理地址
git代理配置
git config --global http.proxy http://10.33.43.240:10809
git config --global https.proxy http://10.33.43.240:10809
使用git config --global -l查看代理配置情况本地代理配置(主要是保证curl)
export http_proxy=http://10.33.43.240:10809
export https_proxy=http://10.33.43.240:10809
编译步骤
1.创建工具目录
mkdir ~/Workspace/google_src/
mkdir ~/Workspace/google_src/automake(用来存放automate-git.py)
2.下载automate-git.py
下载automate-git.py到~/Workspace/google_src/automake
3.下载源码
- 根据指定版本拉取源码,不做编译,总代码大约45G,网络10m下载了1个半小时,git和curl需要设置http和https的代理。
python3 /Users/hitry/Workspace/google_src/automate/automate-git.py --download-dir=/Users/hitry/Workspace/google_src --branch=4430 --no-distrib --no-build --force-clean --x64-build
- automate-git.py参数介绍
--branch 表示要下载哪个版本的代码,CEF 每个版本都有固定的分支,在 CEF 项目页查看分支名称指定即可。
--no-build 表示只下载代码而不编译,这里只为下载代码,我们还要修改支持多媒体的参数,所以不进行编译。
--no-distrib 不执行打包项目,这里只为下载代码,我们还要修改支持多媒体的参数,所以不进行打包。
--force-clean 如果你曾经执行过这个脚本,可能会出错,则加上这个参数,它执行清理残留文件(你也可以手动在 chromium 源码目录执行 git clean -xdf 来清理目录中的多余内容)。
-
检查下载的源码是否版本号是否匹配--branch=4430
cd ~/Workspace/google_src/chromium git status
4.修改ffmpeg的配置
- 修改~/Workspace/google_src/chromium/src/third_party/ffmpeg/chromium/config/Chrome/mac/x64/config.h文件中的下面的宏为1,以支持mp4,h264, flv等。参考资料中提到#define CONFIG_SIPR_PARSER 1 宏一定要打开,否则会在编译时期报错,找不到指定变量(我未验证过,直接设置了1)。
#define CONFIG_FLV_DECODER 1
#define CONFIG_H263_DECODER 1
#define CONFIG_H263I_DECODER 1
#define CONFIG_MPEG4_DECODER 1
#define CONFIG_MPEGVIDEO_DECODER 1
#define CONFIG_MSMPEG4V1_DECODER 1
#define CONFIG_MSMPEG4V2_DECODER 1
#define CONFIG_MSMPEG4V3_DECODER 1
#define CONFIG_RV10_DECODER 1
#define CONFIG_RV20_DECODER 1
#define CONFIG_RV30_DECODER 1
#define CONFIG_RV40_DECODER 1
#define CONFIG_AC3_DECODER 1
#define CONFIG_AMRNB_DECODER 1
#define CONFIG_AMRWB_DECODER 1
#define CONFIG_COOK_DECODER 1
#define CONFIG_SIPR_DECODER 1
#define CONFIG_FLV_ENCODER 1
#define CONFIG_H263_ENCODER 1
#define CONFIG_MPEG4_ENCODER 1
#define CONFIG_MSMPEG4V2_ENCODER 1
#define CONFIG_MSMPEG4V3_ENCODER 1
#define CONFIG_RV10_ENCODER 1
#define CONFIG_RV20_ENCODER 1
#define CONFIG_AAC_ENCODER 1
#define CONFIG_AC3_ENCODER 1
#define CONFIG_AC3_PARSER 1
#define CONFIG_COOK_PARSER 1
#define CONFIG_H263_PARSER 1
#define CONFIG_MPEG4VIDEO_PARSER 1
#define CONFIG_MPEGVIDEO_PARSER 1
#define CONFIG_RV30_PARSER 1
#define CONFIG_RV40_PARSER 1
#define CONFIG_SIPR_PARSER 1
#define CONFIG_AC3_DEMUXER 1
#define CONFIG_AMR_DEMUXER 1
#define CONFIG_AMRNB_DEMUXER 1
#define CONFIG_AMRWB_DEMUXER 1
#define CONFIG_AVI_DEMUXER 1
#define CONFIG_AVISYNTH_DEMUXER 1
#define CONFIG_FLV_DEMUXER 1
#define CONFIG_H263_DEMUXER 1
#define CONFIG_H264_DEMUXER 1
#define CONFIG_MPEGTS_DEMUXER 1
#define CONFIG_MPEGTSRAW_DEMUXER 1
#define CONFIG_MPEGVIDEO_DEMUXER 1
#define CONFIG_RM_DEMUXER 1
#define CONFIG_AC3_MUXER 1
#define CONFIG_AMR_MUXER 1
#define CONFIG_AVI_MUXER 1
#define CONFIG_FLV_MUXER 1
#define CONFIG_H263_MUXER 1
#define CONFIG_H264_MUXER 1
#define CONFIG_MPEGTS_MUXER 1
#define CONFIG_RM_MUXER 1
-
设置GN_DEFINES(激活 ffmpeg 内部解码器,macos 注意必须加引号)
可以直接在终端里边导入,也可以按照文档修改文件 export GN_DEFINES="ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true"
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 文件到项目目录下才能运行。
5.创建工程
cd ~/Workspace/google_src/chromium/src/cef
./cef_create_projects.sh
可以在 ~/Workspace/google_src/chromium/src/out 目录下看到这些工程目录:
hitry@hitry-25761deMacBook-Pro out % ls -l
total 8
drwxr-xr-x 313 hitry staff 10016 5 12 02:07 Debug_GN_x64
drwxr-xr-x 211 hitry staff 6752 5 12 09:23 Debug_GN_x64_sandbox
drwxr-xr-x 313 hitry staff 10016 5 11 20:54 Release_GN_x64
drwxr-xr-x 211 hitry staff 6752 5 11 20:57 Release_GN_x64_sandbox
-rw-r--r-- 1 hitry staff 24 5 11 14:03 cef.branch
6.编译cef
cd ~/Workspace/google_src/chromium/src
ninja -C out/Release_GN_x64 cef
编译速度取决于电脑性能,尽量关闭其他耗性能程序,本人电脑MacBook Pro (16-inch, 2019),处理器2.6 GHz 六核Intel Core i7, 内存16 GB 2667 MHz DDR4,编译花费了5个小时,大概编译了50000万个文件。我很顺利一次通过,但是参考资料说是增量编译,不用担心修改后重头来。
7.验证编解码是否激活
cd ~/Workspace/google_src/chromium/src
open out/Debug_GN_x64/cefclient.app
在打开的cefclient中输入http://html5test.com测试,结果如下图:
8.编译sandbox
cd ~/Workspace/google_src/chromium/src
ninja -C out/Release_GN_x64_sandbox cef_sandbox
这个编译速度很快,大概编译290多个文件。
9.打包工程
cd ~/Workspace/google_src/chromium/src/cef/tools
./make_distrib.sh --ninja-build --x64-build --minimal
--minimal,表示打包Release 版本,不包含 Debug。如果需要debug也包含的话,去掉即可,且需要编译debug版本的cef和sandbox。
--x64-build,表示打包64,一定要添加,否则会按照32的打包,会出错
打包结果如下(这里包含了debug)
hitry@hitry-25761deMacBook-Pro binary_distrib % ls -l
total 8978992
drwxr-xr-x 15 hitry staff 480 5 12 09:41 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64
-rw-r--r-- 1 hitry staff 228530743 5 12 09:25 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64.zip
drwxr-xr-x 3 hitry staff 96 5 12 09:25 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_debug_symbols
-rw-r--r-- 1 hitry staff 1518713565 5 12 09:28 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_debug_symbols.zip
drwxr-xr-x 9 hitry staff 288 5 11 21:40 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_minimal
-rw-r--r-- 1 hitry staff 100726351 5 11 21:40 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_minimal.zip
drwxr-xr-x 3 hitry staff 96 5 11 21:40 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_minimal_release_symbols
-rw-r--r-- 1 hitry staff 1368036763 5 11 21:42 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_minimal_release_symbols.zip
drwxr-xr-x 3 hitry staff 96 5 12 09:25 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_release_symbols
-rw-r--r-- 1 hitry staff 1368036731 5 12 09:29 cef_binary_90.6.5+g7a604aa+chromium-90.0.4430.93_macosx64_release_symbols.zip
编译结果
下载链接地址:
链接: https://pan.baidu.com/s/1onH-6vE7bF48SJBGAgx2gA 提取码: wknc
参考文档:
https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart.md
https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding.md
https://bitbucket.org/chromiumembedded/cef/wiki/AutomatedBuildSetup.md