windows下编译cef最新版本,让Chromium支持音频视频mp3mp4

在工程中需要用到一些视频功能。CEF发布的版本并不支持,网络上编译发布者也寥寥无几,即便在茫茫网络中找到,可能也是比较早的版本或不适合使用。

编译目标版本: Chromium 93.0.4577.82 x86

版本编译环境:
硬件: i3-9100 / 16G RAM / 1T固态
软件: windows10 x64
编译环境:
Visual Studio 2019 Pro
Python 3.9
Windows 10 SDK (10.0.19041.0)
ninja (python 的编译工具)
需要一把能够摘到苹果的梯子(网络环境很重要)

一. 编译环境

准备好你的时间和精力,找到你心目中的白雪公主

步骤如下:

  1. 找到对应版本,以稳定版本4577(93.0.4577.82)编译为例
  2. 下载自动编译脚本automate-git.py
  3. 保存到 c:\cef 目录下(最好固态听硬盘100%狂转声音心痛)
  4. 执行脚本,下载4577版本编译
  5. 喝咖啡看书去
  6. 开启音视频的支持选项(MP3/MP4)
  7. 执行脚本,编译Release版本
  8. 继续喝咖啡看书去
  9. 测试收工

cef发布版本地址,实际生成要稳定版本,想要吃大闸蟹的直接最新版本
https://cef-builds.spotifycdn.com/index.html

下载编译脚本automate-git.py地址
https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py

二. 下载编译版本

手工敲命令太麻烦

重点: 如你已经有个能摘到苹果的梯子(http://127.0.0.1:10809)
重点: 如你已经有个能摘到苹果的梯子(http://127.0.0.1:10809)
重点: 如你已经有个能摘到苹果的梯子(http://127.0.0.1:10809)

创建两个文件用来下载和设置代理

down4577.bat ---- 下载的命令批处理
proxy_webrtc.boto ---- 编译工具的代理配置

down4577.bat

echo off
echo proxy setup ...
echo --------------------
netsh winhttp set proxy 127.0.0.1:10809
git config --global http.proxy http://localhost:1080
git config --global https.proxy http://localhost:1080
set https_proxy=http://127.0.0.1:10809
set http_proxy=http://127.0.0.1:10809
set BOTO_PATH=C:\cef\proxy_webrtc.boto
set NO_AUTH_BOTO_CONFIG=C:\cef\proxy_webrtc.boto

echo env setup ...
echo ----------------------
set CEF_USE_GN=1
set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome
set GYP_DEFINES=buildtype=Official
set GYP_MSVS_VERSION=2019
set CEF_ARCHIVE_FORMAT=tar.bz2
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*

python automate-git.py --download-dir=C:\cef\src4577 --branch=4577 --no-build

pause

proxy_webrtc.boto

[Boto]
proxy = 127.0.0.1
proxy_port = 10809
proxy_type = http

具体参数看下面说明,下载时需要注意些内容

注:

  • bat中netsh winhttp命令需要管理员权限
  • 有装TortoiseGit的把Shell图标更新关闭
  • 有杀毒的也最好关了
  • 用完proxy注意关,以免影响其他程序
  • 注意关掉电脑睡眠功能

三. 设置编译参数,开启音视频支持

创建编译配置文件:

  1. mp4_config.txt ---- 开启参数配置定义
  2. update_mp4.py ---- 更新脚本
  3. udpate_mp4.bat ---- 更新执行命令

上面的文件全部都放在 c:\cef 目录下

mp4_config.txt 这些编译开关全部打开,手工改直接吐血

#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

update_mp4.py 更新脚本

import sys
import shutil
import re
import os

def Replace(change,content):
  str_array = re.findall("#define\s\w+\s",change)
  str_replace =str_array[0]
  str_replace+="0"
  str_dest =str_array[0]
  str_dest+="1"
  return content.replace(str_replace,str_dest)

if len(sys.argv) > 2 :
  src_file_name =sys.argv[1]
  dest_file_name=sys.argv[2]
else:
  src_file_name =raw_input("Please input src file path name:").replace("\r","")
  dest_file_name =raw_input("Please input dest file path name:").replace("\r","")

print(src_file_name)
print(dest_file_name)

file_src_handle = open(src_file_name,"r")
file_src_lines = file_src_handle.readlines()
file_src_handle.close()
file_dest_handle = open(dest_file_name,"r")
dest_file_content = file_dest_handle.read()
file_dest_handle.close()

for line in file_src_lines:
  dest_file_content = Replace(line,dest_file_content)

write_file_path = os.getcwd()+"\\"+ os.path.basename(dest_file_name)
ready_copy = open(write_file_path,"w")
ready_copy.write(dest_file_content)
ready_copy.close()

shutil.copy(write_file_path,dest_file_name)
os.remove(write_file_path)
print("Support mp4 Success!!!")

update_mp4.bat 执行脚本,修改x64和x86的编译开关

python update_mp4.py c:/cef/mp4_config.txt C:/cef/src4577/chromium/src/third_party/ffmpeg/chromium/config/Chrome/win/ia32/config.h
python update_mp4.py c:/cef/mp4_config.txt C:/cef/src4577/chromium/src/third_party/ffmpeg/chromium/config/Chrome/win/x64/config.h
pause

四. 编译Release版本

批处理文件
build_x86_4577.bat

开启后编译是最终结果(需要的版本),只用于发布的话release版本足以。全编太耗时了,现在想到要买i9的好处,或公司内组网编译

创建 build_x86_4577.bat 编译x86 Release批处理

set https_proxy=http://127.0.0.1:10809
set http_proxy=http://127.0.0.1:10809
set BOTO_PATH=C:\cef\proxy_webrtc.boto
set NO_AUTH_BOTO_CONFIG=C:\cef\proxy_webrtc.boto

set PYTHONLEGACYWINDOWSSTDIO=utf8
set PYTHONIOENCODING=utf8
set PYTHONUTF8=1
set CEF_USE_GN=1
set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome
set GYP_DEFINES=buildtype=Official
set GYP_MSVS_VERSION=2019
set CEF_ARCHIVE_FORMAT=tar.bz2
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_GENERATORS=ninja,msvs-ninja
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*
set WIN_CUSTOM_TOOLCHAIN=1
set CEF_VCVARS=none

set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional
set SDK_ROOT=C:\Program Files (x86)\Windows Kits\10
set INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared;C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\include;C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\include;%INCLUDE%
set PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86;C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\HostX64\x86;C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Redist\MSVC\14.29.30133\x64\Microsoft.VC141.CRT;%PATH%
set LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86;C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\lib\x86;C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\lib\x86;%LIB%
set VS_CRT_ROOT=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\crt\src\vcruntime

python automate-git.py --download-dir=C:\cef\src4577 --branch=4577 --build-log-file --verbose-build --force-distrib --force-build --no-debug-build --no-update

pause

Win SDK 目录 C:\Program Files (x86)\Windows Kits\10
VS 2019 目录 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional

根据实际情况替换

注: 要x64的版本,在最后 python 编译命令最后加 --x64-build 选项

python automate-git.py --download-dir=C:\cef\src4577 --branch=4577 --build-log-file --verbose-build --force-distrib --force-build --no-debug-build --no-update --x64-build

具体参数看下面说明

执行命令等完成,最好找点其他事做,如喝咖啡看书啊之类的。

五. 验收成果

编译完成后在out目录下会生成很多测试exe,方便检查编译的相关功能

输出目录

C:\cef\src4577\chromium\src\out

打开 cefclient.exe 文件,打开http://html5test.com简单查看功能编译情况

编译测试通过的CEF x86版本,保留了发布用文件,如需要可自取。压缩包里带了两个测试exe

cefclient.exe  编译cef时产生的
SimpleBrowser2.exe 自己编译的测试文件  

Chromium 93.0.4577.82
链接:https://pan.baidu.com/s/10YOd0M3injp39BMl-Ts3Dw 
提取码:1a7n

编译个版本真不容易,太吃CPU全程100%好几小时,没有好的CPU或没有组网(VS企业版有分布式编译),编译版本太累。

六. 编译参数说明

上面使用的的参数

--help 编译选项明细列表
--download-dir 源码下载目录
--depot-tools-dir工具包目录
--branch 源码分支(默认trunk主分支)
--no-build 下载完不自动开始编译(需要修改编译配置)
--no-update 确定源码下载完毕仅重新编译时使用
--force-build 强制编译(发现在有成功编译的时候再编译不会执行,可以加上这个
--no-debug-build 只编译release版本
--no-release-build 只编译debug版本

七. 其他相关问题

1. Visual Studio 2019 版本问题

Q: 电脑上原来安装的是社区版本,不知道什么情况没编译成功,浪费了不少时间
A: 改装了Pro版本就OK

2. Windows的编译环境问题

Q: 机器上装了很多编译环境, msys64、FPC等
A: 直接把目录名字加 .bak防止搜索到不该使用的编译器

3. tortoise git status cache 消耗大量CUP资源,处理方法

Q: 在下载和编译时git目录会频繁更新目录内的文件,TortoiseGit会刷新Shell的图标,导致大量消耗宝贵的CUP。编译时先关闭Shell的图标刷新
A: 关闭 TortoiseGit Shell, 在资源管理器中右击选择设置

Settings->Icon Overlays->Status cache->None

4. 要命的GBK Python编码问题

Q: windows下默认是GBK的,python在读取文件时在没指定编码的情况下会直接使用环境信息,编译到一半花费了大量时间,中间Error GBK错误,吐血

    bundled_paths = _bundle_v3(tmp_out_dir, in_path, out_path,
  File "../../chrome/browser/resources/tools/optimize_webui.py", line 185, in _bundle_v3
    output = f.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa2 in position 137404: illegal multibyte sequence
[26852/50270] ninja -t msvc -e environment.x86 -- ..\..\third_party\llvm-build\Release+Asserts\bin\lld-link.exe /OUT:./bytecode_builtins_list_generator.exe /nologo -libpath:..\..\third_party\llvm-build\Release+Asserts\lib\clang\13.0.0\lib\windows "-libpath:../../../../../../Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.29.30133/ATLMFC/lib/x86" "-libpath:../../../../../../Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.29.30133/lib/x86" "-libpath:../../../../../../Program Files (x86)/Windows Kits/NETFXSDK/4.8/lib/um/x86" "-libpath:../../../../../../Program Files (x86)/Windows Kits/10/lib/10.0.19041.0/ucrt/x86" "-libpath:../../../../../../Program Files (x86)/Windows Kits/10/lib/10.0.19041.0/um/x86"  /PDB:./bytecode_builtins_list_generator.exe.pdb @./bytecode_builtins_list_generator.exe.rsp

A: 解决方法:第一种,设置全局环境utf-8 set PYTHONUTF8=1,第二种,设置你的window变成英文(这个也不错)

set PYTHONLEGACYWINDOWSSTDIO=utf8
set PYTHONIOENCODING=utf8
set PYTHONUTF8=1

没空去试,上面三个那个正确全设上 stackoverflow参考

参考地址: https://stackoverflow.com/questions/50933194/how-do-i-set-the-pythonutf8-environment-variable-to-enable-utf-8-encoding-by-def

5. Windows SDK 问题

Q: 安装VS2019是装了SDK,但Windows SDK目录不知道在那里
A: 独立下载安装了个WinSDK,目录默认C:\Program Files (x86)\Windows Kits\10

下载地址: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/

6. 取消Git全局代理

git config --global --unset http.proxy
git config --global --unset https.proxy

7. 取消winhttp全局代理

netsh winhttp reset proxy

8. 安装 ninja

pip install ninja

END(Moguf.com 蘑菇房)