【编译CEF3】2017-07 添加支持mp3 mp4的编译日记
由于工作需要集成cef3来整合一个H5浏览器,前期也通过网上了解很多信息,最后下载了某个网友的cef3.2623版本编译好的bin文件包,支持mp3,mp4,使用2623版本是因为这是最后一个支持XP的版本。
最近客户一些H5游戏可能用到一些新的js功能,2623上有时会出现问题,不得不升级到新版本,经过一番调查,选用3071版本(实际程序是2623和3071同时存在),由于新版本在网上没找到支持mp3,mp4的bin文件包,无奈只能尝试自己编译。
本人想法是先编译master,熟悉一遍再去折腾3071版本,所以3071版本的编译要到最后面才记录日志。不管怎么样,先编译通过了再说。。。。。。。。。。。。
2017-07-20(尝试):
1)在网上搜索查看了大部分关于chromium和cef的编译资料,以及官网等资料介绍,很多人说编译目录要简单,如在C:\cef\或D:\cef路径来下载编译,总之目录结构尽量简短,不然会碰到各种坑。
2)网上经常说编译过程漫长且经常出问题
...
初探
怀着一颗恐惧的心开始编译历程,打开了cef官网,在正式开始前,本人以为能够侥幸在官网下载到需要的bin包,如http://opensource.spotify.com/cefbuilds/index.html和https://cefbuilds.com都下载尝试,后面才觉悟,这些说白了只是cef的SDK包(即编译后的用于开发浏览器的开发环境,包含了cef浏览器相关的dll和res以及部分相关的源码),而cef的编译环境(全部源码,工具链等)还是需要乖乖下载。
这里要鄙视一下网上各类什么cef 环境搭建,cef编译搭建等等文章,让人眼花缭乱,初次接触cef的人很容易给绕懵了,
本人对此颇有微言,一定要向初学者说明什么是cef编译环境,什么是cef开发环境。
cef编译环境: 用于编译cef源码 ---> 对应Windows来说,就是Windows系统源码了
cef开发环境: 用于集成cef开发浏览器APP(也就是通俗的CEF SDK) ----->对应Windows来说,就是Windows API(DLL,LIB,INCLUDE...), WDK/DDK等。。。。
既然是要编译cef,当然就要搭建编译环境了。
源码下载的坑
大部分介绍cef编译的关于源码下载部分都说需要买一个vpn,本人不信邪(没钱),就在http://opensource.spotify.com/cefbuilds/index.html上下载cef和chromium源码,其中chromium源码所在网站访问不了(国外服务器,如 https://gsdview.appspot.com/chromium-browser-official/chromium-59.0.3071.109.tar.xz),最后被我找到了在https://blink.lc/chromium/上有镜像下载,全部源码下载后,本人想根据cef官网的构建方法来编译,结果根本不行,编译过程需要的git,这就要求各个源码目录被checkout才能下一步走,哭死。。。。。。。。。。。。
后面发现automate-git.py里面其实可以跳过git步骤进入后面的patch和build的,但在patch部分不知什么原因过不去了,要我人工完成patch并修改automate-git.py跳过patch步骤也可以,不过我没那么傻,谁知道后面会有什么更恐怖的问题,所以最后干脆放弃了。。。。。。。。
vs2015的坑
同时本人在一开始也安装VS2015,参照网上说的全部按照默认不要修改路径之类的,结果安装出来的VS2015缺少VC++ sdk,Windows SDK等,需要重新运行安装程序再把这些都添加进去,这里也造成了我后面的悲剧,所以千万不要安装默认,一定要选自定义,勾选VC++和Windows SDK,至于其他C# 移动开发等看个人,总体上讲VS2015的跨平台战略非常强大(体积也大)。
2017-07-21(下载源码)
经过昨天的SM行为,我决定按照官网一步一步来(免vpn下载源码,一次通过):
1)创建目录结构
E:\03_Develop\cef3\ automate\ automate-git.py <-- CEF build script chromium_git\ update.bat <-- Bootstrap script for automate-git.py depot_tools <-- Chromium build tools
对于网上说的什么目录结构要越简短越好,我不信邪,目录就创建在E:\03_Develop\cef3下,后面有问题再说,非要在E盘根目录下搞个莫名奇妙的目录实在无法忍受,本人倾向于工作中要有合理的目录管理。
2)先下载depot_tools.zip解压到E:\03_Develop\cef3\depot_tools下,用cmd命令行进入该目录,运行update_depot_tools.bat,期间会下载python和Git,SVN。
由于网络不同,而vpn和FQ软件一直以来就是被我拒绝的,主要是对网络上那些使用了此类工具后经常表现一种政治优越感的人让我由衷讨厌,为了访问外国网站有很多办法,本人通过http://ping.chinaz.com查找服务器IP,修改hosts文件后进行下载(就是下载过程中提示哪个网址无法访问下载就找对应网站的IP,IP先要本机能够ping通)。
3)下载automate-git.py到E:\03_Develop\cef3\automate下,
4)在E:\03_Develop\cef3\chromium_git下创建update.bat,内容为:
set CEF_USE_GN=1 set GN_DEFINES=is_win_fastlink=true set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/* python ..\automate\automate-git.py --download-dir=c:\code\chromium_git --depot-tools-dir=c:\code\depot_tools --no-distrib --no-build
在命令行下执行update.bat,这里会下载cef和chromium源码,由于下载量过大,本人对自己找到的IP不放心,万一半夜断网那岂不是悲剧,所以在网上找了google hosts文件(laod博客)来用,速度不错,就是可能一个月后就失效了,也还算是稳定吧(这是本人或国内开发android时非常有效的下载SDK方法)。
5)下载过程没有网上说的那么漫长,2个多小时就完成了,9G左右吧(不过后面编译会下载工具链第三方库等也要1小时左右)
2017-07-22(安装VS2015)
昨晚下班回家,到半夜公司机器自动更新后重启了,本来弄了个teamviewer想要远程加班的,看来天意难违啊,程序员万恶的加班连老天都看不下去了。
cef和chromium源码已经下载完成了,现在要来安装vs2015了,由于之前全部安装默认安装后被坑害了,C盘也剩一百多MB了,再添加Windows SDK也已经不可能,只能先卸载掉已安装的VS2015。
网上说最好把其他vs都卸载掉,安装也都使用默认路径,本人还是不信邪(C盘快满了,已安装的VS2013旗舰版也要用),就把vs2015安装到F盘(还有200G空间),期间中午吃饭电脑又重启一次,气得我直接把系统自动更新,休眠,屏保什么的都关闭掉了。安装一半的VS2015只能用Windows install cleanup(msicuu2)清除掉,再重新安装,这一步把我坑惨了,各种安装错误失败问题,网上有人说一些VS安装失败的莫名其妙问题怎么重装卸载重装都不行,搞得最后重装系统,我不信邪(重装系统的代价太严重了),花了半天各种尝试研究,到后面也解决了,记录在这里:
Visual Studio 2015/2013安装失败:Microsoft Visual Studio 2015 Shell (Minimum) Interop Assemblies 安装时发生严重错误
虽然解决了安装VS2015问题,但不知道是因为第一次安装失败重新换路径安装后有问题还是什么原因,勾选了VS2015自带的Windows SDK安装出来居然缺少debugger和um的库,只有ucrt库(和相关的uap配置文件),这个我开始一知半解,以为ucrt可以代替windows的um库,就没管,直接去编译,后面真正编译才知道太天真了。
2017-07-24(开始编译)
参考官网,在E:\03_Develop\cef3\chromium_git\chromium\src\cef下创建create.bat,内容如下:
set CEF_USE_GN=1 set GN_DEFINES=is_win_fastlink=true set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/* call cef_create_projects.bat
源码下载一半失败的坑
尼玛,居然在E:\03_Develop\cef3\chromium_git\chromium\src下找不到cef目录,完了,肯定前面的update.bat有错误了,再运行一次,发现Git都checkout正确然后完成了。经过一番折腾,我修改update.bat文件,加上--force-clean --force-clean-deps参数(参考官网内容),这次Git先remove掉一些文件再重新checkout了,后来发现是在下载chromium的第三方库时出现问题了,有些文件包下载不了,之前使用的hosts文件加上对应的域名,IP其实都一样,但是加上--force-clean --force-clean-deps参数后每次都要remove在update,非常耗时(到后面我发现有--force-update 参数,但是已经下载完成了就没有测试,也许可以把,看automate-git.py的内容是有更新下载的)。
谷歌云存储google-storage: gs://xxxxxx文件 下载的坑
在下载第三方库和build工具时,有部分文件是在谷歌云存储服务器下载的,链接地址是gs://开头的,在depot工具里有访问gs的模块,但我发现根本下载不了,在网上查找了一番,发现可以修改为https下载。修改内容如下,有兴趣展开查看
1. 按照cef说明,执行到update.bat,报错,gs://xxxxx无法访问 2. 修改E:\03_Develop\cef3\depot_tools下的download_from_google_storage.py,将其中 A) base_url = 'gs://%s' % options.bucket 改为 base_url = 'https://storage.googleapis.com/%s' % options.bucket B) 搜索 # Check if file exists.段,注释原来的代码(多行),去掉gs判断检查 C) 搜索 # Fetch the file.段,改为http下载,同时增加download_url函数 如下: import urllib def download_url(src, target): """ the contents of src, which may be a URL or local file, to the target directory. """ if src[:4] == 'http': # Attempt to download a URL. opener = urllib.FancyURLopener({}) response = opener.open(src) CHUNK = 16 * 1024 with open(target, 'wb') as f: while True: chunk = response.read(CHUNK) if not chunk: break f.write(chunk) else: raise Exception('Path type is unsupported or does not exist: ' + src)
由于这里修改了depot的py文件,按照前面的update.bat会导致Git提示需要commit才能继续,所以需要去掉depot tools update功能,在update.bat里加上参数:--no-depot-tools-update --force-clean --force-update 。
2017-07-25 (解决build目录下gs://下载问题)
再次执行update.bat,第三方库下载完成了,但是后面更新build目录的时候又出现一个gs://xxxx下载错误,排查后发现是get_syzygy_binaries.py里面的下载失败导致的,同样修改为https下载(参考前面)。但由于是每次执行update.bat都会重新下载get_syzygy_binaries.py的,所以修改后的又被覆盖回去了,本人是先把修改后的get_syzygy_binaries.py备份到E:\03_Develop\cef3\chromium_git\patch下,再修改automate-git.py文件,在其中的chromium源码更新并checkout完成后,用copyfile函数把备份的E:\03_Develop\cef3\chromium_git\patch\get_syzygy_binaries.py复制替换到E:\03_Develop\cef3\chromium_git\chromium\src\build下即可(否则每次都会提示gs://xxxx下载失败)。
到这里,需要下载的全部完成了。
整个cef源码编译环境算是99%完成了,剩下的已经是编译的问题了。经过不断的折腾,本人对编译过程的python脚本流程也渐渐熟悉起来,查找定位普通的问题并修改都可以应付了。
正式编译
由于源码编译环境和vs2015都准备好了,开始编译,本人也不按照官网说的使用create.bat来编译了,而是修改update.bat文件,先整个文件复制粘贴重命名为build.bat文件,修改内容如下:
set CEF_USE_GN=1 set GN_DEFINES=is_win_fastlink=true set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/* python ..\automate\automate-git.py --no-depot-tools-update --no-debug-build --force-build --no-update --download-dir=E:\03_Develop\cef3\chromium_git --depot-tools-dir=E:\03_Develop\cef3\depot_tools
2017-07-26 (Windows Kit版本错误问题)
Windows Kit的坑
在命令行下运行build.bat,开始哗啦啦编译处理,在Generating CEF project files... 创建工程文件时,又发生错误,找不到C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\dbghelp.dll文件,前面提到过多次卸载重装修改vs2015可能导致这种问题吧,也可能系统上已经安装的win8,win8.1等SDK有影响,总之我到微软官网下载了最新的SDK(Windows Kit 10),下载的10.0.15063.0版本,安装后,这次能找到dbghelp.dll了,也顺利生成工程文件(以为这样就顺利了,简直大错特错)。
fatal error C1083: 无法打开包括文件: “windows.h”: No such file or directory
在生成工程文件后,会自动使用ninja编译工程,这里又报错误,找不到windows.h文件,因为前面对vs2015的折腾,本人以为把vs2015环境给搞乱了,打开空的工程后,其中$<WindowsSDK_IncludePath>宏指向的是Win8.1的SDK路径(C:\Program Files (x86)\Windows Kits\8.1\Include\um),然后又是各种折腾vs2015的.props文件,试图修改该宏为C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um。最后修改成功了,可是重新执行build.bat仍然是错误。
2017-07-27 (解决Windows Kit版本错误,VS2015自定义路径问题,完成cef3.Master编译)
昨天折腾到半夜,输出各种日志,最后想想,没理由啊,文件都在,路径都对,怎么会找不到。
今天上班推断肯定不是vs2015的问题,而是编译配置文件的问题,结果查看编译日志,发现其中一行:
ninja -t msvc -e environment.x86
凭直觉猜测问题在于这个environment.x86,应该是个编译配置文件(此时本人对ninja完全不懂), 然后就尝试搜索environment.x86文件(神器everything,delphi开发的全球巨星级工具),真的找到该文件,在其中找到了INCLUDE=xxxxx,其中WindowsKit版本指定了10.0.14393.0,总算找到问题点了(其实cef官网也已经指明了Windows Kit的版本就是要10.0.14393.0的,只是我不信邪,非要踩坑)。
注: 这里奇怪的是我发现INCLUDE=中引用的ucrt路径是使用15063.0\ucrt的,所以我觉得environment.x86应该也是搜集系统环境信息生成的,应该可以修改一下生成机制,使其使用新的15063.0版本,但本人没再去深入,想想也是,chromium源码一再升级,势必会使用新版本的sdk,也就是修改某一个配置项,只是没去找具体在哪里设置了。
接下来要么把C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0目录直接重命名为C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0,但我怕这样会导致vs2015出现其他问题,就老老实实去下载14393版本的SDK来安装了。
多版本Windows Kit的坑
下载14393版本的SDK后安装,继续执行前面的build.bat,提示一堆重定义错误,原因是同时引用了10.0.15063.0和10.0.14393.0的include头文件,可能多版本存在对environment.x86文件的生成逻辑有影响。卸载掉10.0.15063.0版本的SDK,再次执行build.bat,奇怪的是仍然提示重定义错误,而且错误信息仍然有引用10.0.15063.0的文件,可实际上10.0.15063.0的文件已经卸载删掉了,不应该有重定义的错误啊,猜测可能ninja编译缓存的问题吧。
清除ninja编译缓存
由于前面build.bat出现的重定义错误,本人尝试清除ninja编译缓存,复制粘贴build.bat并重命名为clean.bat(同样是在E:\03_Develop\cef3\chromium_git目录下),内容修改为:
set CEF_USE_GN=1 set GN_DEFINES=is_win_fastlink=true set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/* python ..\automate\automate-git.py --force-clean --no-depot-tools-update --no-build --no-update --download-dir=E:\03_Develop\cef3\chromium_git --depot-tools-dir=E:\03_Develop\cef3\depot_tools
在命令行执行clean.bat,这里应该直接删除out目录也可以(没测试),完成后再次执行build.bat,这下真的哗啦哗啦开始编译了,漫长的等待。
本人编译使用的机器6核12线程,应该比普通的机器快不少,看着任务管理器里10多个cl.exe就知道速度不低,Xeon E5这样老旧的CPU仍然能够坚持在抗战一线。
不安装VS2015到默认路径(C:\Program Files(X86)\XXXX)下的坑
由于本人不信邪,将VS2015安装到F盘的Program_Files下,在编译的最后真出现问题了,错误如下:
-------- Running "msvs_env.bat win32 python combine_libs.py -o "E:\03_Develop\ce f3\chromium_git\chromium\src\cef\binary_distrib\cef_binary_3.3113.1650.g6da2bbf_ windows32\Release\cef_sandbox.lib" "E:\03_Develop\cef3\chromium_git\chromium\src \out\Release_GN_x86\obj\base\base.lib" "E:\03_Develop\cef3\chromium_git\chromium \src\out\Release_GN_x86\obj\base\base_static.lib" "E:\03_Develop\cef3\chromium_g it\chromium\src\out\Release_GN_x86\obj\base\third_party\dynamic_annotations\dyna mic_annotations.lib" "E:\03_Develop\cef3\chromium_git\chromium\src\out\Release_G N_x86\obj\cef\cef_sandbox.lib" "E:\03_Develop\cef3\chromium_git\chromium\src\out \Release_GN_x86\obj\sandbox\win\sandbox.lib"" in "E:\03_Develop\cef3\chromium_gi t\chromium\src\cef\tools"... ERROR: Failed to find vcvars
查找msvs_env.bat后发现,里面写死了路径
set vcvars="%PROGRAMFILES(X86)%\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"
填坑的办法就是设置环境变量 %CEF_VCVARS%,查看msvs_env.bat可知优先使用这个环境变量(可能问题是要区分32位和64位,但是谁会吃饱撑着去编译64位呢),我决定修改build.bat文件,简单快捷,而且这里已经编译完成了,只是链接打包出现问题,所以又复制粘贴build.bat并重命名为distrib.bat,内容如下:
set CEF_VCVARS=F:\Program_Files\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat set CEF_USE_GN=1 set GN_DEFINES=is_win_fastlink=true set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/* python ..\automate\automate-git.py --no-depot-tools-update --no-build --no-update --no-debug-build --force-distrib --download-dir=E: \03_Develop\cef3\chromium_git --depot-tools-dir=E:\03_Develop\cef3\depot_tools
支持,已经完成默认Master的编译了,在E:\03_Develop\cef3\chromium_git\chromium\src\cef\binary_distrib下生成了2个目录
cef_binary_3.3113.1650.g6da2bbf_windows32和cef_binary_3.3113.1650.g6da2bbf_windows32_release_symbols,并自动打包出zip文件。
剩下的就是编译3071版本并加入MP3和MP4支持了
2017-07-28 (开始编译cef3.3071,支持MP3 MP4)
昨晚编译了Master加上MP3,MP4支持的版本,cef_binary_3.3113.1650.g6da2bbf_windows32.
发现C盘居然只剩4G空间了,一下去掉10G,查找一遍发现是分页文件(虚拟内存)暴涨了,应该是使用is_official_build=true参数后,编译过程需要的内存暴涨导致的,网上有人说使用official编译开关最好是有16G内存,看来果然是。
基于前面的基础,本人开始下载3071版本并编译,01_update-3071.bat文件如下:
set CEF_USE_GN=1 set GN_DEFINES=is_official_build=true ffmpeg_branding=Chrome proprietary_codecs=true set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/* :: --force-update python ..\automate\automate-git.py --no-depot-tools-update --download-dir=E:\03_Develop\cef3\chromium_git --depot-tools-dir=E:\03_Develop\cef3\depot_tools --no-distrib --no-build --branch=3071
注:其中加入 ffmpeg_branding=Chrome proprietary_codecs=true,就是支持ffmpeg了,ffmpeg默认就支持mp3和mp4,而 is_official_build=true 则是正式版本编译(去掉debug符号和加入编译优化等)。
下载完成后,本人开始编译,02_build-MP3MP4-Release-3071.bat文件如下:
set CEF_VCVARS=F:\Program_Files\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat set CEF_USE_GN=1 set GN_DEFINES=is_official_build=true ffmpeg_branding=Chrome proprietary_codecs=true set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/* python ..\automate\automate-git.py --no-depot-tools-update --no-debug-build --force-build --no-update --branch=3071 --download-dir=E:\03_Develop\cef3\chromium_git --depot-tools-dir=E:\03_Develop\cef3\depot_tools
一切都很顺利,从下午5点半开始下载,漫长的等待,到完善8点开始编译,又是漫长的等待.....
2017-07-29 (编译cef3.3071完成)
早上起来看到已经编译完成了,输出的cef_binary_3.3071.1649.g98725e6_windows32包,再从http://opensource.spotify.com/cefbuilds/index.html上下载3071的sample包,运行后测试HTML5, 也就是在浏览器打开网址 http://html5test.com,得到511分,比opera的518稍微低了,不过音视频MP3和mp4都支持了。
到这里基本上都完成了,后面再试试网上说的,让ffmpeg音视频支持更多的解码器,不过已经不重要了,html5最主要就是支持mp3和mp4,这2种都具备支持高清能力,其他都是次要的,最多让客户转码一下就好了。
增加支持rmvb,avi,flv,wmv等格式视频
这里增加编码的方法如下:
从Chromium的源码third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h可以得知Chrome采用的FFmpeg的配置选项,在原有的配置选项后面添加如下选项: --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'
其中 rmvb电影视频编码是RV40,音频编码是COOK,所以这样子编译后应该支持rmvb了,不过貌似仍然会有花屏现象(vlc也会出现类似问题,貌似是说ffmpeg的使用问题吧,没空去研究)
#解决错误:无法识别的符号_ff_w64_guid_data #修改chromium/third_party/ffmpeg / ffmpeg_generated.gni #在行"libavformat/vorbiscomment.c",后加入 "libavformat/w64.c", // 注意尾部要加上逗号,不要直接复制引号内容 #解决egl语法错误 #修改chromium\src\third_party\swiftshader\include\egl\eglext.h #在62行后加入 typedef EGLAttribKHR EGLAttrib;
删除src下的out目录,再次build,不知道能不能编译通过..........
2017-07-31 (完成)
3071版本编译完成,支持MP3,MP4,应该也支持RMVB,AVI,WMV,已经集成到正式APP中.
2017-08-03 编译2924版本
需要在控制面板里将系统的区域语言设置为:英文(美国),
否则将会出现一个codepage 936无法识别字符的错误。估计是utf8编码转成ansi时有部分没转好吧,也可以将出错的文件另存为unicode,这样就不用改系统语言了。
2017-09-28 下载 cef_binary_3.3071.1649-Sample-MP3MP4-RMVB
1)cef_binary_3.3071.1649-Sample-MP3MP4-RMVB (仅包含二进制文件包)
http://pan.baidu.com/s/1geFRKen
2)cef_binary_3.3071.1649.g98725e6_windows32 (cef开发包:包含二进制文件和lib文件,头文件等...)
http://pan.baidu.com/s/1eS3ubb8