由于官方自动构建的Windows平台下的cef并不支持H.264,需要手动编译。
环境准备
除非你能忍受长达数天的下载和编译时间,请不要使用个人电脑!
除非你有超级稳定的梯子,请不要使用个人电脑!
除非你的PC超高配置,请不要使用个人电脑!
在折腾了两天之后,我终于换到海外服务器进行编译了!
一台Qiang外的高配置服务器
我在阿里云租用了美国硅谷的服务器(可以按小时计费),配置大概是这样(租金大概9元/小时)。
CPU&内存: 16核 32GiB
操作系统: Windows Server 2019 数据中心版 64位英文版
云盘:160G
一定要租国外(或香港)的服务器。
操作系统建议选英文版,如果不小心选了中文版,登录后把区域和语言改成美国。
服务器租好后,安装以下软件:
Visual Studio 2019 仅安装“使用C++的桌面开发”即可
-
Visual Studio 2019的安装选项中并没有这个选项,我需要编译的最新稳定版本(4664分支, 96.*版本)必须需要这个版本的SDK。别问我怎么知道的。
Python 3.x 安装时勾上“把Python加入系统环境变量中”
Chrome 由于Windows Server 2019自带的浏览器只有IE 11, 为了舒服,我还单独下载了Chrome
Notepad++ 为了方便修改文件,建议装个Notepad++
编译
-
目录结构展示
|--dirty/ | |--depot_tools/ | |--automate/ | | |--automate-git.py | |--chromium_git/ | | |--chromium/ | | | |--src/ | | | | |--cef/ | | | | | |--binary_distrib/ | | | | |--out/ | | | | | |--Release_GN_x86/
-
下载工具depot_tools.zip,然后解压,更新
$ cd dirty\depot_tools $ update_depot_tools.bat
将depot_tools目录添加到系统的PATH环境变量中
下载自动编译脚本到automate目录
-
下载代码
$ cd dirty $ python automate\automate-git.py --download-dir=c:\dirty\chromium_git --depot-tools-dir=c:\dirty\depot_tools --branch=4664 --no-distrib --no-build
download-dir: 代码下载目录
depot-tools-dir: 工具目录
branch: 要编译的分支,我选择了最新一个稳定版本的分支
no-distrib: 不打包
no-build: 不编译
-
生成工程文件
$ set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome is_debug=false target_cpu=x86 is_cef_sandbox_build=false $ set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/* $ cd dirty\chromium_git\chromium\src\cef $ call cef_create_projects.bat
-
修改dirty\chromium_git\chromium\src\third_party\ffmpeg\chromium\scripts\build_ffmpeg.py
找到configure_flags['Chrome'].extend,大概在Line 1014
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', ])
-
修改dirty\chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h
在第4行下增加如下代码
#define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-error-resilience --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio,vp9' --extra-cflags=-I/usr/local/google/home/jrummell/chromium/src/third_party/opus/src/include --disable-linux-perf --x86asmexe=nasm --optflags='\"-O2\"' --enable-decoder='theora,vp8' --enable-parser='vp3,vp8' --toolchain=msvc --extra-cflags=-I/usr/local/google/home/jrummell/chromium/src/third_party/ffmpeg/chromium/include/win --enable-cross-compile --cc=clang-cl --ld=lld-link --nm=llvm-nm --ar=llvm-ar --extra-cflags=-O2 --extra-cflags=-m32 --extra-cflags=-imsvc/usr/local/google/home/jrummell/chromium/src/third_party/ffmpeg/../depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/win_sdk/Include/10.0.18362.0/um --extra-cflags=-imsvc/usr/local/google/home/jrummell/chromium/src/third_party/ffmpeg/../depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/win_sdk/Include/10.0.18362.0/shared --extra-cflags=-imsvc/usr/local/google/home/jrummell/chromium/src/third_party/ffmpeg/../depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/win_sdk/Include/10.0.18362.0/winrt --extra-cflags=-imsvc/usr/local/google/home/jrummell/chromium/src/third_party/ffmpeg/../depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/win_sdk/Include/10.0.18362.0/ucrt --extra-cflags=-imsvc/usr/local/google/home/jrummell/chromium/src/third_party/ffmpeg/../depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/VC/Tools/MSVC/14.23.28105/include --extra-cflags=-imsvc/usr/local/google/home/jrummell/chromium/src/third_party/ffmpeg/../depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/VC/Tools/MSVC/14.23.28105/atlmfc/include --extra-ldflags='-libpath:/usr/local/google/home/jrummell/chromium/src/third_party/depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/VC/Tools/MSVC/14.23.28105/atlmfc/lib/x86' --extra-ldflags='-libpath:/usr/local/google/home/jrummell/chromium/src/third_party/depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/win_sdk/Lib/10.0.18362.0/ucrt/x86' --extra-ldflags='-libpath:/usr/local/google/home/jrummell/chromium/src/third_party/depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/win_sdk/Lib/10.0.18362.0/um/x86' --extra-ldflags='-libpath:/usr/local/google/home/jrummell/chromium/src/third_party/depot_tools/win_toolchain/vs_files/9ff60e43ba91947baca460d0ca3b1b980c3a2c23/VC/Tools/MSVC/14.23.28105/lib/x86' --enable-decoder='aac,h264' --enable-demuxer=aac --enable-parser='aac,h264' -enable-decoder=’rv10,rv20,rv30,rv40,cook,h263,h263i,mpeg4,msmpeg4v1,msmpeg4v2,msmpeg4v3,amrnb,amrwb,ac3,flv’ -enable-demuxer=’rm,mpegvideo,avi,avisynth,h263,aac,amr,ac3,flv,mpegts,mpegtsraw’ -enable-parser=’mpegvideo,rv30,rv40,h263,mpeg4video,ac3′"
-
编译
$ cd dirty\chromium_git\chromium\src $ ninja -C out\Release_GN_x86 cef
-
打包 (你可能不需要此步骤,直接使用编译出来的libcef.dll替换官方编译包中的即可)
$ cd dirty\chromium_git\chromium\src\cef\tools $ make_distrib.bat --ninja-build --minimal
打包完成后可以在dirty\chromium_git\chromium\src\cef\binary_distrib下找到打包的文件
- 当然,你也可以直接享用我的成果,点击我的Google Drive共享链接进行下载
测试
- 运行 dirty/chromium_git/chromium/src/out/Release_GN_x86下面的cefclient.exe, 键入https://html5test.com/,可以看到已经支持H264了
可能遇到的问题
-
链接时提示"cannot create a temporary file"
修改组策略,不对每个会话使用临时文件夹。
运行
gpedit.msc
, 计算机配置->管理模板->Windows组件->远程桌面服务->临时文件夹,启用“不对每个会话使用临时文件夹”。英文系统下是,Computer Configuration->Administrative Templates->Windows Components->Remote Desktop Services->Remote Desktop Session Host->Temporary folders, Enable "Do not use temporary folders per session"
-
编译时提示Unicode编码相关的错误
请确认区域和语言是否修改成了美国和英文。