编译带 ffmpeg(支持MP3/MP4等) 的CEF(Windows x86 + macOS x64)遇到的一些问题记录

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/epubcn/article/details/81093752

注:本文记录的是 CEF 3396(2018年4月份的官方Release版本)的编译记录。

网上比较多介绍的都是Windows版本的CEF编译说明,macOS版本的比较少。Windows版本的CEF我基本上比较顺利就编译过了,带ffmpeg支持(H.264/MP3/MP4等)。下面是我使用的编译命令:

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=2017
set CEF_ARCHIVE_FORMAT=tar.bz2
set GN_ARGUMENTS=--ide=vs2017 --sln=cef --filters=//cef/*
automate-git.py --download-dir=D:\chromium\source --branch=3396 --force-build --force-clean --minimal-distrib --client-distrib

其中GYP的2个环境变量我感觉不用应该也可以,不过官网编译介绍上有,加上也没什么关系。
带ffmpeg支持主要是GN_DEFINES那一行比较重要。
上面命令会编译x86版本的Debug和Release,如果你不需要Debug版本,可以增加-no-debug-build来节省编译时间。
不算首次下载整个源码,光编译x86的Windows版本我大概就用了接近一天的时间,当然这很大原因是因为我找到的机器性能也不是非常好。

这里有个插曲,其实我一开始是尝试编译 3440 (2018年6月官方Release的版本)来着,但后面发生了错误,错误信息如下:

-------- Running "msvs_env.bat win32 python combine_libs.py -o "D:\chromium\source\chromium\src\cef\binary_distrib\cef_binary_3.3440.1792.g7f28743_windows32\Debug\cef_sandbox.lib" "D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\base.lib" "D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\base_static.lib" "D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\third_party\dynamic_annotations\dynamic_annotations.lib" "D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\win\pe_image.lib" "D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\cef\cef_sandbox.lib" "D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\sandbox\win\sandbox.lib"" in "D:\chromium\source\chromium\src\cef\tools"...
vcvars:
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars32.bat"
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.7.4
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86'
PATH:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCPackages;C:\Program Files (x86)\Microsoft SDKs\TypeScript\2.8;C:\Program Files (x86)\Microsoft SDKs\TypeScript\2.8;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TestWindow;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\bin\Roslyn;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Team Tools\Performance Tools;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x86;C:\Program Files (x86)\Windows Kits\10\bin\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\\MSBuild\15.0\bin;C:\Windows\Microsoft.NET\Framework\v4.0.30319;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\;D:\chromium\source\depot_tools\win_tools-2_7_6_bin\python\bin;D:\chromium\source\depot_tools\win_tools-2_7_6_bin\python\bin\Scripts;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools;D:\chromium\source\depot_tools\;C:\Python27;C:\Python27\Scripts;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\dotnet\;C:\Program Files (x86)\Xoreax\IncrediBuild;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\SciTools\bin\pc-win64;C:\Program Files\Git\cmd;C:\Users\bjsl\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Bandizip\
command:
python combine_libs.py -o D:\chromium\source\chromium\src\cef\binary_distrib\cef_binary_3.3440.1792.g7f28743_windows32\Debug\cef_sandbox.lib D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\base.lib D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\base_static.lib D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\third_party\dynamic_annotations\dynamic_annotations.lib D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\base\win\pe_image.lib D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\cef\cef_sandbox.lib D:\chromium\source\chromium\src\out\Debug_GN_x86_sandbox\obj\sandbox\win\sandbox.lib
Traceback (most recent call last):
File "combine_libs.py", line 119, in <module>
sys.exit(Main())
File "combine_libs.py", line 114, in Main
CombineLibraries(output, remove_re, args)
File "combine_libs.py", line 59, in CombineLibraries
Shell(*args)
File "combine_libs.py", line 27, in Shell
raise RuntimeError('%s exited with status %d' % (args[0], retcode))
RuntimeError: lib.exe exited with status 1136
Traceback (most recent call last):
File "D:\chromium\source\chromium\src\cef\tools\\make_distrib.py", line 749, in <module>
os.path.join(dst_dir, 'cef_sandbox.lib'))
File "D:\chromium\source\chromium\src\cef\tools\\make_distrib.py", line 314, in combine_libs
run(cmdline, os.path.join(cef_dir, 'tools'))
File "D:\chromium\source\chromium\src\cef\tools\\make_distrib.py", line 323, in run
args, cwd=working_dir, env=os.environ, shell=(sys.platform == 'win32'))
File "D:\chromium\source\depot_tools\win_tools-2_7_6_bin\python\bin\lib\subprocess.py", line 540, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['msvs_env.bat', 'win32', 'python', 'combine_libs.py', '-o', 'D:\\chromium\\source\\chromium\\src\\cef\\binary_distrib\\cef_binary_3.3440.1792.g7f28743_windows32\\Debug\\cef_sandbox.lib', 'D:\\chromium\\source\\chromium\\src\\out\\Debug_GN_x86_sandbox\\obj\\base\\base.lib', 'D:\\chromium\\source\\chromium\\src\\out\\Debug_GN_x86_sandbox\\obj\\base\\base_static.lib', 'D:\\chromium\\source\\chromium\\src\\out\\Debug_GN_x86_sandbox\\obj\\base\\third_party\\dynamic_annotations\\dynamic_annotations.lib', 'D:\\chromium\\source\\chromium\\src\\out\\Debug_GN_x86_sandbox\\obj\\base\\win\\pe_image.lib', 'D:\\chromium\\source\\chromium\\src\\out\\Debug_GN_x86_sandbox\\obj\\cef\\cef_sandbox.lib', 'D:\\chromium\\source\\chromium\\src\\out\\Debug_GN_x86_sandbox\\obj\\sandbox\\win\\sandbox.lib']' returned non-zero exit status 1
Traceback (most recent call last):
File "D:\chromium\automate-git.py", line 1655, in <module>
run(path, cef_tools_dir, depot_tools_dir)
File "D:\chromium\automate-git.py", line 61, in run
args, cwd=working_dir, env=env, shell=(sys.platform == 'win32'))
File "C:\Python27\lib\subprocess.py", line 186, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['D:\\chromium\\source\\chromium\\src\\cef\\tools\\make_distrib.bat', '--ninja-build']' returned non-zero exit status 1

关键的错误是:RuntimeError: lib.exe exited with status 1136

然后我到CEF Forum上准备反馈一下,但发现已经有几位老兄反馈过跟我一样的问题了,后来官方很快在2018年7月9日(https://bitbucket.org/chromiumembedded/cef/issues/2470)在master上修复了这个问题。这里要赞一个,人家认真负责的态度。

3396和3440都属于我编译时官方Release的正式版本,相差2个月,但因为项目需要,等不及3440了,先用3396一段时间再更新吧。

============

下面简单说一下 macOS x64版本的编译。因为Windows 3440没有编译过,所以担心macOS也编译不过,就直接编译了3396了。
下面是我在macOS上使用的编译命令:

export CEF_USE_GN=1
export GN_DEFINES="is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome"
export GYP_DEFINES=buildtype=Official
export CEF_ARCHIVE_FORMAT=tar.bz2
./automate-git.py --download=/Users/bjy/Workspace/chromium/source --branch=3396 --minimal-distrib --client-distrib --force-clean --x64-build

有一个细节不知道您注意到没有。GN_DEFINES=后面的内容,和Windows的一样,但是加了双引号。这一点非常非常重要!我一开始没有加引号,结果花了一天时间编译后,发现不支持H.264,也就是说ffmpeg没有打上。网上介绍的大多都是修改若干源文件、配置文件的方式,修改的文件我感觉会在automate-git.py执行时自动清除覆盖掉(除非单步执行automate-git.py中的编译步骤)。担心再兜圈子,然后在CEF Forum逛了逛,偶然发现有个人提到了他通过增加双引号解决了这个问题,如获至宝,又花了接近20个小时编译了一遍,在 html5test.com 上测试了一把,OK了~  H.264/MP3/AAC等常见的流媒体所需音视频编解码都支持了。

最后提一下,如果不是追求特别新的内容,建议使用CEF官方正式Release的版本号来编译。这个页面很重要:
https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding
最好严格按照这个页面上提到的编译环境来准备,否则编译中会遇到各种各样奇葩的问题。

还有我在编译macOS x64版本的过程中,还遇到一个奇葩问题,错误信息如下:

Generating CEF project files...
Creating /Users/bjy/Workspace/chromium/source/chromium/src/out/Debug_GN_x64 directory.
________ running 'gn gen out/Debug_GN_x64' in '/Users/bjy/Workspace/chromium/source/chromium/src'
/Users/bjy/Workspace/chromium/source/chromium/.gclient_entries missing, .gclient file in parent directory /Users/bjy/Workspace/chromium/source/chromium might not be the file you want to use.
/Users/bjy/Workspace/chromium/source/chromium/.gclient_entries missing, .gclient file in parent directory /Users/bjy/Workspace/chromium/source/chromium might not be the file you want to use.
gn.py: Could not find gn executable at: /Users/bjy/Workspace/chromium/source/chromium/src/buildtools/mac/gn
Traceback (most recent call last):
  File "tools/gclient_hook.py", line 133, in <module>
    RunAction(src_dir, cmd)
  File "/Users/bjy/Workspace/chromium/source/chromium/src/cef/tools/gclient_util.py", line 39, in RunAction
    gclient_utils.CheckCallAndFilterAndHeader(command, cwd=dir, always=True)
  File "/Users/bjy/Workspace/chromium/source/depot_tools/gclient_utils.py", line 314, in CheckCallAndFilterAndHeader
    return CheckCallAndFilter(args, **kwargs)
  File "/Users/bjy/Workspace/chromium/source/depot_tools/gclient_utils.py", line 576, in CheckCallAndFilter
    rv, args, kwargs.get('cwd', None), None, None)
subprocess2.CalledProcessError: Command 'gn gen out/Debug_GN_x64' returned non-zero exit status 2 in /Users/bjy/Workspace/chromium/source/chromium/src
Traceback (most recent call last):
  File "./automate-git.py", line 1497, in <module>
    run(path, cef_src_dir, depot_tools_dir)
  File "./automate-git.py", line 62, in run
    args, cwd=working_dir, env=env, shell=(sys.platform == 'win32'))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/Users/bjy/Workspace/chromium/source/chromium/src/cef/cef_create_projects.sh']' returned non-zero exit status 1
localhost:chromium bjy$ gclient
Usage: gclient.py <command> [options]

意思是说.gclient_entries这个文件找不到,后来还遇到 /src/native_client/toolchain_revisions/nacl_arm_glibc.json 里面定义的一些 https 开头的文件下载发生 timeout…… 比如:https://storage.googleapis.com/nativeclient-once/object/binutils_arm_x86_64_linux_475b45f35de7eb128a94a1ff45c84700ce39498b.tgz 这个文件就一直 timeout,但我在Chrome浏览器就能下载。我手动把json中的地址修改成 http开头的,下载过了但后面文件校验又出问题了……总之是各种坑。

最后发现原来问题出现在我使用的 SS Server有问题,换了一个SS Server,一切不愉快如丝滑般地都过去了……

所以奉劝大家,编译这些GFW外的东西,一定一定一定要找一个靠谱的SS Server,可以让你做事情事半功倍。

猜你喜欢

转载自blog.csdn.net/epubcn/article/details/81093752