CEF3 添加mp4播放功能
总共包含两大部分:
1、编译需要的工作流程
2、编译中遇到的错误(在最后)
第一部分
一、编译条件
- 准备稳定的VPN(非常重要),需要翻墙下载40G左右的文件
- Win7或者更新的系统,必须64位,至少8GB的RAM,我采用win10 64位,16GRAM
- 比较新的VS,最近免费的社区版(编译不同版本要求不一样,具体看Cef官网帮助,我用的是VS2017),需要安装“C++桌面组件” 和 “MFC和ATL支持”,最好安装在默认路径,VS2017还需要特殊配置
- Win10 SDK,安装vs自带
- 至少100G剩余空间(官方要求),NTFS文件系统,部分文件超过4G,部分资料显示最少60G,编译结束后发现远超60G
二、准备工作
- 创建工作目录,路径不能包含空格及特殊字符。例如e:\cef
- 下载编译工具包,提取码
xuee
,解压至工作目录。例如e:\cef\depot_tools - 下载编译脚本,提取码
8htl
至工作目录。例如e:\cef - 在工作目录下创建源码目录。例如e:\cef\source
- 添加系统环境变量
set CEF_USE_GN=1
set GN_DEFINES=is_official_build=true
set GYP_DEFINES=buildtype=Official
set GYP_MSVS_VERSION=2017
set CEF_ARCHIVE_FORMAT=tar.bz2
Path添加e:\cef\depot_tools,为避免与已安装的python或git冲突,写在path靠前位置。
若环境变量设置后任有问题,在cmd使用set设置,例如:set DEPOT_TOOLS_WIN_TOOLCHAIN=0
完整目录结构:
e:/ cef/automate-git.pydepot_tools/source/
三、网络环境配置
- 设置代理
1.1. shadowsocks设置为全局模式
1.2. 打开具有管理员权限的cmd,输入如下指令
>netsh
netsh>winhttp
netsh winhttp>
netsh winhttp>
netsh winhttp>set proxy 127.0.0.1:1080
其中127.0.0.1:1080为代理的IP地址和端口号,其中端口必须和代理端口一致
设置完成后,退出该cmd就可以了。该设置使固化在系统,重新启动之后,该设置依然有效。 查看代理端口的方法如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4ZLAk8q-1663137443040)(c560740fcb4735b19883449f0caf8c0e8247f47f.png)]
1.3. 设置http代理和Git代理 在CMD中输入:
>set http_proxy=http://127.0.0.1:1080
>set https_proxy=http://127.0.0.1:1080
>set socks5_proxy=socks5://127.0.0.1:1080
为git设置代理 a)使用http/https代理服务器
>git config --global http.proxy %http_proxy%
>git config --global https.proxy %https_proxy%
或者:b)使用socks5代理服务器
>git config --global http.proxy %socks5_proxy%
>git config --global https.proxy %socks5_proxy%
验证git代理 设置完后,用下面命令看是否成功:
>git config --get http.proxy
>git config --get https.proxy
1.4. 设置Boto代理 创建.boto文件
[Boto]
proxy = 127.0.0.1
proxy_port = 1080
在cmd中set NO_AUTH_BOTO_CONFIG=E:\cef.boto,.boto位置任意 用来下gs://开头的文件,千万127.0.0.1前不要加http://
四、检出代码
- 切换到工作目录e:\cef
- 使用命令下载源码
第一次执行:python automate-git.py --download-dir=E:\CEF3\source --branch=4389 --no-build --no-distrib --force-clean
如果中间出现错误停止了,则执行
python automate-git.py --download-dir=E:\CEF3\source --branch=4389 --no-build --no-distrib
其中–branch=4389是指定要下载的Cef版本,查看branch号的方法;
–no-build --no-distrib是只下载代码而不编译;
–force-clean这个参数用于清理Chromium和Cef的一些检出信息,如果没有一次性下载成功而再次执行下载命令时,需要带上这个参数来清理一些信息,否则检出会失败(第一次下载时直接带上这个参数也可以)。
下载和编译只需要这个一个脚本就可以,脚本会自动下载depot_tools 、Chromium、Cef等源码。如果下载过程中出现错误,就再次执行这个命令直到下载完成。
网络调通以后不会有太多问题,下载时间和网络速度有关,我用了5个小时多些全部下载完成。
五、编译代码
- 修改代码
1.1. 修改:source\chromium\src\third_party\ffmpeg\chromium\scripts\build_ffmpeg.py 文件
configure_flags['Chrome'].extend([ '--enable-decoder=aac,h264,mp3', '--enable-demuxer=aac,mp3,mov', '--enable-parser=aac,h264,mpegaudio', ])
改为
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', ])
分别打开下面两个文件:
source\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h和
source\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.h
在原有配置宏FFMPEG_CONFIGURATION里增加以下:
--enable-demuxer='rm,mpegvideo,avi,avisynth,h263,aac,amr,ac3,flv,mpegts,mpegtsraw'--enable-parser='mpegvideo,rv30,rv40,h263,mpeg4video,ac3'
注:但有些版本FFMPEG_CONFIGURATION节点是被禁用的,只需要解注释,并添加上面的参数
并把部分#define 由0改为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
因为改的比较多,这里我们通过python的脚本进行帮我们修改
新建一个mp4_config.txt把上面宏定义的内容复制进去
新建一个update_mp4.py的脚本,内容如下:
## 第一参数为上面要修改的#define 的文件路径,第二参数为 F:\cef\source\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h
import sys
import shutil
import re
import osdef 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","")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!!!")
例如:python update_mp4.py F:/cef/script/mp4_support.txt F:/cef/source/chromium/src/third_party/ffmpeg/chromium/config/Chrome/win/ia32/config.h
pause
- 设置参数
2.1. 环境变量设置
//为保险再设置一次
set CEF_USE_GN=1
set GN_DEFINES=is_official_build=true
set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome 添加MP3、MP4支持 使用此条指令
set GYP_DEFINES=buildtype=Official
set GYP_MSVS_VERSION=2017
set CEF_ARCHIVE_FORMAT=tar.bz2set GYP_GENERATORS=ninja,msvs-ninja
set GN_ARGUMENTS=--ide=vs2017 --sln=cef --filters=//cef/*
//VS2017安装在默认目录,但任然需要下面设置,可能是由于VS2015和VS2017同时安装,路径根据自己的安装目录和版本确定
set WIN_CUSTOM_TOOLCHAIN=1
set CEF_VCVARS=none
下面的非常重要,一定要配置正确
2.2. vs安装路径和SDK路径(我的安装在D:\Install\VS2017\IDE目录
)
set GYP_MSVS_OVERRIDE_PATH=D:\Install\VS2017\IDEset SDK_ROOT=D:\Windows Kits\10set INCLUDE=D:\Windows Kits\10\Include\10.0.19041.0\um;D:\Windows Kits\10\Include\10.0.19041.0\ucrt;D:\Windows Kits\10\Include\10.0.19041.0\shared;D:\Install\VS2017\IDE\VC\Tools\MSVC\14.16.27023\include;D:\Install\VS2017\IDE\VC\Tools\MSVC\14.16.27023\atlmfc\include;%INCLUDE%set PATH=D:\Windows Kits\10\bin\10.0.19041.0\x64;D:\Install\VS2017\IDE\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86;D:\Install\VS2017\IDE\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64;D:\Install\VS2017\IDE\VC\Redist\MSVC\14.16.27012\x64\Microsoft.VC141.CRT;%PATH%set LIB=D:\Windows Kits\10\lib\10.0.19041.0\um\x64;D:\Windows Kits\10\lib\10.0.19041.0\ucrt\x64;D:\Install\VS2017\IDE\VC\Tools\MSVC\14.16.27023\lib\x64;D:\Install\VS2017\IDE\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64;%LIB%set VS_CRT_ROOT=D:\Install\VS2017\IDE\VC\Tools\MSVC\14.16.27023\crt\src\vcruntime
- 执行编译脚本
32位编译
python automate-git.py --download-dir=e:\cef\source --branch=4389 --no-update --build-log-file --verbose-build --force-distrib --force-build --no-debug-build
x64编译
python automate-git.py --download-dir=e:\cef\source --branch=4389 --x64-build --no-update --build-log-file --verbose-build --force-distrib --force-build --no-debug-build
备注:参数说明
–download-dir 源码下载目录
–depot-tools-dir 工具包目录
–branch 源码分支(默认trunk主分支)
–checkout 指定patch版本(默认最近提交)
–no-build 下载完不自动开始编译(我们需要修改编译配置)
–no-update 确定源码下载完毕仅重新编译时使用
–force-build 强制编译(发现在有成功编译的时候再编译不会执行,可以加上这个
–no-debug-build 只编译release版本
–no-release-build 只编译debug版本
-
脚本进入漫长的等待过程,(我的编译环境i7-8700,六个小时左右)
-
编译完成
输出目录为source\chromium\src\out\Release_GN_x86 和 source\chromium\src\cef\binary_distrib,Release_GN_x86下有cefclient.exe可以测试,binary_distrib下有cef_binary_89.0.18+gb36241d+chromium-89.0.4389.114_windows64
双击运行cefclient.exe,并输入网址 http://html5test.com 结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOPJuSjn-1663137443041)(b3258ac6d5314b7227064df0fad0d1ccc0470a1c.png)]
第二部分
一、Q : 执行更新脚本[python automate-git.py --download-dir=E:\CEF3\source --branch=4389 --no-build --no-distrib --force-clean]时报如下错误:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7NQM3chc-1663137443041)(5f6ce9e829b7aa1947dac27a136eface0aa9c97e.png)]
A : 网络设置错误,我用的是Shadowsocks:
1、注意端口号设置;
2、设置成全局代理;
二、Q : 报如下错误:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Io2FEwHF-1663137443042)(9710b72aca9e25761b834a081c0203461f2f5198.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HgYbMEPK-1663137443042)(c791957cd3d4d8d6f6fa35facb5c1493a0f72b92.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S0qFNVHv-1663137443042)(13e2d7d5368ec61ff0da78a313da28c717aea8de.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7zklw5E-1663137443043)(9a8c96df7904a2b41f066e51f02616efd74d4942.png)]
A : 代码没有更新下载完全