Windows下编译cef使其支持H.264

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

环境准备

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

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

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

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

一台Qiang外的高配置服务器

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

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. 目录结构展示

    |--dirty/
    |  |--depot_tools/
    |  |--automate/
    |  |  |--automate-git.py
    |  |--chromium_git/
    |  |  |--chromium/
    |  |  |  |--src/
    |  |  |  |  |--cef/
    |  |  |  |  |  |--binary_distrib/
    |  |  |  |  |--out/
    |  |  |  |  |  |--Release_GN_x86/
    
  2. 下载工具depot_tools.zip,然后解压,更新

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

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

  5. 下载代码

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

  6. 生成工程文件

    $ 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
    
  7. 修改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',
    ])
    
  8. 修改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′"
    
  9. 编译

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

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

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

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

测试

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

可能遇到的问题

  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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342