CEF3 添加mp4播放功能

news/2024/11/23 23:35:09/

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.pydepot_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 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

  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.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
  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 : 代码没有更新下载完全


http://www.ppmy.cn/news/778265.html

相关文章

fopen打开文件方式

最近写一个文件操作类,fopen的参数着实让我搞了半天,因为以前就是固定的方式读写文件的,现在要做灵活了,所以就有些参数理解不够准确。以下是关于mode参数的定义。r 只读方式打开,将文件指针指向文件头,如果…

计算机无法播放asf格式,ASF文件怎么打开播放出来?

如果你遇到视频是ASF格式的,你知道怎么打开吗?asf的全称是Advanced Streaming Format,是微软所制订的一种媒体播放格式,适合在网络上播放,基于Windows Media的文件被定义为ASF文件。 asf简单的说是一种视频文件格式,微…

关于fopen打开文件失败的问题

关于fopen打开文件失败的问题!求大佬救救小白;

ELF文件格式入门

什么是ELF ELF(Executable and Linking Format),即“可执行可连接格式”,最初由 UNIX系统实验室做为应用程序二进制接口(ABI)的一部分而制定和发布。简单说就是一种文件格式。 ELF文件类型 (1)可重定位文件, 一般就是源文件编译生成的".o"文…

设置默认移动端打开pdf,doc,xls等文件附件的打开方式

在web.xml文件里面进行配置 <mime-mapping><extension>doc</extension><mime-type>application/msword</mime-type></mime-mapping><mime-mapping><extension>docm</extension><mime-type>application/vnd.ms-wor…

fopen_s打开文件方式的选择

写一个程序&#xff0c;用socket套接字传递一个图片文件&#xff08;大小&#xff1a;241KB&#xff09;&#xff0c;发送过去后&#xff0c;在生成图片时&#xff0c;大小变为了242KB&#xff0c;自然&#xff0c;图片文件无法预览。 后经查找&#xff0c;在生成图片时&#…

cfg格式文件在服务器哪里,cfg文件,小编教你怎么打开cfg文件

打开cfg文件的难度其实不大&#xff0c;所以小编我没有花很多时间就找到了它的打开方式。但是小编不希望自己的解决方法只有自己知道&#xff0c;所以现在小编就带着解决方法来找你们了。 其实cfg文件是软件的配置文件&#xff0c;就好像我们平时使用的迅雷下载软件一样&#x…

html 如何播放3pg文件,3gp是什么格式文件?3gp文件怎么打开/用什么打开?

3gp文件想必大家都不会陌生&#xff0c;因为在功能机时代3gp几乎称霸了功能机视频平台&#xff0c;那么3gp究竟是什么呢&#xff1f;3gp文件又如何打开呢&#xff1f; 3gp是什么文件 3GP是MP4格式的一种简化版本&#xff0c;减少了储存空间和较低的频宽需求&#xff0c;让手机上…