CEF3 添加mp4播放功能

CEF3 添加mp4播放功能

总共包含两大部分:
1、编译需要的工作流程
2、编译中遇到的错误(在最后)

第一部分

一、编译条件

  1. 准备稳定的VPN(非常重要),需要翻墙下载40G左右的文件
  2. Win7或者更新的系统,必须64位,至少8GB的RAM,我采用win10 64位,16GRAM
  3. 比较新的VS,最近免费的社区版(编译不同版本要求不一样,具体看Cef官网帮助,我用的是VS2017),需要安装“C++桌面组件” 和 “MFC和ATL支持”,最好安装在默认路径,VS2017还需要特殊配置
  4. Win10 SDK,安装vs自带
  5. 至少100G剩余空间(官方要求),NTFS文件系统,部分文件超过4G,部分资料显示最少60G,编译结束后发现远超60G

二、准备工作

  1. 创建工作目录,路径不能包含空格及特殊字符。例如e:\cef
  2. 下载编译工具包提取码 xuee,解压至工作目录。例如e:\cef\depot_tools
  3. 下载编译脚本提取码 8htl至工作目录。例如e:\cef
  4. 在工作目录下创建源码目录。例如e:\cef\source
  5. 添加系统环境变量
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.py
		depot_tools/
		source/

三、网络环境配置

  1. 设置代理
    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://

四、检出代码

  1. 切换到工作目录e:\cef
  2. 使用命令下载源码
第一次执行: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.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 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","")


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

  1. 设置参数
    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.bz2

set 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\IDE


set SDK_ROOT=D:\Windows Kits\10

set 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
  1. 执行编译脚本
    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版本

  1. 脚本进入漫长的等待过程,(我的编译环境i7-8700,六个小时左右)

  2. 编译完成
    输出目录为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 : 代码没有更新下载完全

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值