vs版本:2017 操作系统:win10 webrtc版本:4577
成果物要求: x64的可被vs引入的webrtc库
第一:找个vpn 公司有提供vpn客户端工具,工具启动的端口号是10080 第二:webrtc下载 1.首先打开cmd,输入如下内容
set http_proxy=http:
set https_proxy=http:
set DEPOT_TOOLS_UPDATE=0
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_OVERRIDE_PATH=D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
set GYP_MSVS_VERSON=2017
set GYP_GENERATORS=msvs-ninja,ninja
注意:代理是一定要设置的,否则webrtc无法下载。 2.下载depot_tools cmd中输入下面内容: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 下载成功后,设置环境变量PATH,因为这里面有不少的编译需要的工具,比如著名的ninja.exe 设置环境变量后,重启cmd,重新输入以下内容:
set http_proxy=http:
set https_proxy=http:
set DEPOT_TOOLS_UPDATE=0
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_OVERRIDE_PATH=D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
set GYP_MSVS_VERSON=2017
set GYP_GENERATORS=msvs-ninja,ninja
3.下载webrtc 在e盘下,新建一个git目录,git目录下建立webrtc目录,webrtc目录下再建立webrtc_wins目录。 cmd中执行cd E:\git\webrtc\webrtc_wins,切换到对应的目录。 然后在cmd中执行fetch --nohooks webrtc,这大概要等一段时间,中途会遇到很多Still working on的提示。 下载完成后,再执行gclient sync 说明下,gclient sync建议多执行几次,主要是内地翻墙的原因,一次可能下载的不够彻底,鄙人就遇到过这种情况。 然后cmd中执行下面的命令,定位到4577分支 git checkout -b m4577 refs/remotes/branch-heads/4577 接着继续gclient sync,gclient sync依然建议多执行几次 4.编译webrtc 下载webrtc后,E:\git\webrtc\webrtc_wins下面会多个src目录,cmd中执行cd src,切换到此目录。 然后执行下面命令 gn gen out/Release_h264 --args=“is_clang=false treat_warnings_as_errors=false rtc_include_tests=false is_component_build=false is_debug=false rtc_use_h264=true proprietary_codecs=true ffmpeg_branding=“Chrome”” --ide=vs2017 这个会自动生成ninja文件,然后执行下面的命令,进行ninja编译
ninja -C out/Release_h264 这个要等待一段时间,具体要看机器性能,我的台式机,16G的内容,大概要等30多分钟。
相关参数解析: is_debug 是否是Debug版,默认true,false:表示编译Release版。 target_os: 平台类型,可以取值win、android、ios、linux等,这里取win,表示Windows平台。 target_cpu: cpu类型,Windows下可以取x86、x64 is_component_build :是否使用动态运行期库,这里取false,使用静态运行期库,Release版本将对应MT,Debug版将对应MTd。 proprietary_codecs: 是否使用版权编码,也就是H264,这里取true。 rtc_use_h264: 是否使用H264,这里取true,注意Windows平台编码使用OpenH264,解码使用ffmpeg。 ffmpeg_branding: ffmpeg的分支名,这里采用Chrome的分支。 is_clang: 是否采用clang编译器编译,默认设置为true rtc_include_tests:自动编译单元测试test文件,默认是true,webrtc的单元测试文件很多,设置为false,可以节省不少编译时间。
5.编译中遇到的问题 编译中会遇到各种各样的问题,下面列举几条 5.1 …/…/modules/audio_processing/agc2/rnn_vad/features_extraction.cc(84): error C2398: 元素“2”: 从“const int”转换到“size_t”需要收缩转换 很明显,vs编译器检查是比较严格的,is_clang如果设置成true,就没这种问题。 我们进行下手动强制转换即可。 5.2 e:\git\webrtc\webrtc_wins\src\third_party\ffmpeg\libavcodec\error_resilience.h(23): fatal error C1083: 无法打开包括文件: “stdatomic.h”: No such file or directory 我们在webrtc目录下搜索stdatomic.h,发现third_party\ffmpeg下面存在几个stdatomic.h,将其中的一个放置于third_party\ffmpeg下即可。 5.3 …/…/third_party/ffmpeg/libavcodec/pcm.c(52): error C2065: “CONFIG_PCM_VIDC_ENCODER”: 未声明的标识符 …/…/third_party/ffmpeg/libavcodec/pcm.c(634): error C2059: 语法错误:“字符串” 直接将对应的行代码注释掉 5.4 E:\git\webrtc\webrtc_wins\src\modules/video_coding/codecs/h264/h264_decoder_impl.h(21): fatal error C1189: #error: “See: bugs.webrtc.org/9213#c13.” 直接注释掉 5.5 ffmpeg_internal.lib(pcm.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm(不影响最终webrtc库的生成)
这个问题是最难解决的,其他的问题跟这相比,有点毛毛雨的感觉,尽管此种情况下webrtc.lib可以生成,但是很多exe都无法生成,比如peerconnection_server.exe,并且将生成的webrtc.lib放置于其他vs工程,会报如下的链接错误:
1>webrtc.lib(pcm.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm
1>webrtc.lib(encode.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm
1>webrtc.lib(h264_picture.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm
1>webrtc.lib(avcodec.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm
1>webrtc.lib(decode.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm
1>webrtc.lib(h264dec.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm
1>webrtc.lib(vp3.obj) : error LNK2001: 无法解析的外部符号 avpriv_emms_asm
所以这个问题必须解决 解决方法:替换ffmpeg文件,x86版本无此问题,x64才会出现,原因是x64不支持大多数汇编指令,ffmpeg里面有汇编代码,用clang就没那个问题,但是clang编译的vc不能引用
现在来讲讲如何替换ffmpeg文件,这里说的ffmpeg指的是third_party\ffmpeg这个目录。
我是这样替换的,我们之前用的webrtc是72版本的,72版本的64位lib库很容易编译通过 编译通过后,我们将72版本的third_party\ffmpeg替换过来,然后接着生成ninja文件,在生成ninja文件的过程中,会出现两个错误。 第一:需要将72版本的third_party\yasm替换过来 第二:需要更改build\config\compiler目录下的BUILD.gn,里面需要在指定位置添加黄色区域的一段内容,这段内容其实是从72版本里面拷贝过来的。
除此外,编译的时候,注意用MD而不是MT,为此,我修改了文件 build\config\win下面的BUILD.gn,修改内容如下: 这里,我将原来的static_crt改成了dynamic_crt。
|