由于官方自动构建的Windows平台下的cef并不支持H.264,需要手动编译。

环境准备

除非你能忍受长达数天的下载和编译时间,请不要使用个人电脑!

除非你有超级稳定的梯子,请不要使用个人电脑!

除非你的PC超高配置,请不要使用个人电脑!

在折腾了两天之后,我终于换到海外服务器进行编译了!

一台Qiang外的高配置服务器

我在阿里云租用了美国硅谷的服务器(可以按小时计费),配置大概是这样(租金大概9元/小时)。

1
2
3
CPU&内存: 16核 32GiB
操作系统: Windows Server 2019 数据中心版 64位英文版
云盘:160G

一定要租国外(或香港)的服务器。

操作系统建议选英文版,如果不小心选了中文版,登录后把区域和语言改成美国。

服务器租好后,安装以下软件

  • Visual Studio 2019 仅安装“使用C++的桌面开发”即可

  • Windows 10 SDK 19041

    Visual Studio 2019的安装选项中并没有这个选项,我需要编译的最新稳定版本(4664分支, 96.*版本)必须需要这个版本的SDK。别问我怎么知道的。

  • Python 3.x 安装时勾上“把Python加入系统环境变量中”

  • Chrome 由于Windows Server 2019自带的浏览器只有IE 11, 为了舒服,我还单独下载了Chrome

  • Notepad++ 为了方便修改文件,建议装个Notepad++

编译

  1. 目录结构展示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    |--dirty/
    | |--depot_tools/
    | |--automate/
    | | |--automate-git.py
    | |--chromium_git/
    | | |--chromium/
    | | | |--src/
    | | | | |--cef/
    | | | | | |--binary_distrib/
    | | | | |--out/
    | | | | | |--Release_GN_x86/
  2. 下载工具depot_tools.zip,然后解压,更新

    1
    2
    $ cd dirty\depot_tools
    $ update_depot_tools.bat
  3. 将depot_tools目录添加到系统的PATH环境变量中

  4. 下载自动编译脚本到automate目录

  5. 下载代码

    1
    2
    $ 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: 不编译

  1. 生成工程文件

    1
    2
    3
    4
    $ 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
  2. 修改dirty\chromium_git\chromium\src\third_party\ffmpeg\chromium\scripts\build_ffmpeg.py

    找到configure_flags[‘Chrome’].extend,大概在Line 1014

    1
    2
    3
    4
    5
    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',
    ])
  3. 修改dirty\chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h

    在第4行下增加如下代码

    1
    #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′"
  4. 编译

    1
    2
    $ cd dirty\chromium_git\chromium\src
    $ ninja -C out\Release_GN_x86 cef
  5. 打包 (你可能不需要此步骤,直接使用编译出来的libcef.dll替换官方编译包中的即可)

    1
    2
    $ cd dirty\chromium_git\chromium\src\cef\tools
    $ make_distrib.bat --ninja-build --minimal

​ 打包完成后可以在dirty\chromium_git\chromium\src\cef\binary_distrib下找到打包的文件

  1. 当然,你也可以直接享用我的成果,点击我的Google Drive共享链接进行下载

测试

  1. 运行 dirty/chromium_git/chromium/src/out/Release_GN_x86下面的cefclient.exe, 键入https://html5test.com/,可以看到已经支持H264了

可能遇到的问题

  1. 链接时提示”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”

  2. 编译时提示Unicode编码相关的错误

    请确认区域和语言是否修改成了美国和英文。

Reference