iOS下载、编译WebRTC及demo

作者: MFJun | 来源:发表于2017-08-15 10:37 被阅读3427次

    WebRTC的源码很大,大概需要6G左右,作者一开始也不想自己下载编译,用CocoaPods下载编译好的库:pod 'libjingle_peerconnection',但是在使用时,WebRTC静态库(libWebRTC.a),和我使用的openssl库冲突,所以就自己进行下载编译,在过程中,发现之前的编译文档有些坑或者版本低,所以就写了本文。已经将编译好的WebRTC.framework上传到github,直接使用请下载后,跳到第六步查看使用WebRTC.framework注意事件

    使用WebRTC进行音视频文字传输WebRTC_iOS demo

    1.安装环境

    系统环境:Mac OS
    网络环境:准备好稳定的VPN工具

    2.安装git

    http://www.cnblogs.com/ccdev/archive/2012/09/12/2682098.html

    3.安装depot_tools

    创建一个目录专门来存放项目编译工具和项目代码仓库等,确保该目录所在磁盘可用空间至少有8~10G.打开系统的终端工具:

    mkdir webrtc_build
    

    在执行下面命令之前,请确保你已经连上VPN已经FQ了,或者你已经给git单独配置了有效的socksFQ代理。开始安装depot_tools,这是一套Google用来编译Chromium或者WebRTC的构建工具,在我们后续的编译过程中也将使用它。

    a.  cd webrtc_build
    
    b.  git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    
    c.  把depot_tools 设置到PATH中:echo "export PATH=$PWD/depot_tools:$PATH" > $HOME/.bash_profile
    
    d.  使PATH设置生效:source $HOME/.bash_profile
    
    e.  echo $PATH查看设置是否生效。
    

    4、获取WebRTC源码

    在我们的编译工作目录webrtc_build下创建一个webtrtc子目录来存放代码:

    mkdir webrtc
    
    cd webrtc
    

    开始把WebRTC项目的代码仓库下载一份到本地来,由于其仓库之大,大约一共需要下载6G+的东西,所以这一步非常需要有耐心,而且需要有稳定无障碍的互联网:

    a.  设置要编译的平台到环境变量中:export GYP_DEFINES="OS=ios"
    
    b.  fetch --nohooks webrtc_ios
    
    c.  gclient sync
    

    c步骤,也可以使用gclient sync -r eeab9ccb2417cab18ae1681c6644c25fa4eadcd3指定版本,注意:eeab9ccb2417cab18ae1681c6644c25fa4eadcd3为版本号。获取版本号方式为:

    a. 进入[WebRTC](https://webrtc.org/native-code/ios/)官网
    
    b. 点击上方About->Release Notes
    
    c. 选择想要下载的版本,例如M59,进入如下页面
    
    d. 点击WebRTC M59 branch后
    
    e. 选择第一行,进入如下页面
    

    现在即可见到版本号eeab9ccb2417cab18ae1681c6644c25fa4eadcd3。
    注意:fetch --nohooks webrtc_ios 和 gclient sync这一步需要等待很久。

    5.编译WebRTC

    源码下载好了,现在目录结构如下图:


    这些源码可以编译为好几个平台,OS X、Linux、 Windows、Android、iOS等。这里我们只需要编译iOS平台的WebRTC,并制作成一个iOS的开发框架,我们需要在终端命令行环境下去搞定这一切。

    5.1设置构建配置,分环境编译

    a.  进入WebRTC源码文件:cd src
    
    b.  根据需要编辑构建配置,编译iOS系统,设置为target_os="ios",编译iOS真机,target_cpu为"arm"或"arm64",编译iOS模拟器,target_cpu="x64",如:
    
    gn gen out/ios_64 --args='target_os="ios" target_cpu="arm64"'
    
    gn gen out/ios_sim --args='target_os="ios" target_cpu="x64"'
    
    c.  开始编译:ninja -C out/ios_64 AppRTCMobile
    

    编译后,得到arm64下的WebRTC.framework,目录结构如下图:


    5.2使用脚本,自动编译

    在我们下载的源代码中有一个编译脚本,还是以我们下载的M59版本为例,其位置在src/tools_webrtc/ios/build_ios_libs.sh,直接执行这个脚本就能编译出需要的库文件了。编译后目录结构如下图:


    图中选中的WebRTC.framework为包含arm64、arm、x64环境的库,如果需要具体环境下的WebRTC.framework,进入相应文件夹选择。

    6.使用WebRTC.framework注意事件

    将WebRTC.framework导入工程后,运行会报错:

    dyld: Library not loaded: @rpath/WebRTC.framework/WebRTC
    
    Referenced from: /Users/MFJun/Library/Developer/CoreSimulator/Devices/4441D192-28A0-46AF-9CA9-C8945BB3442C/data/Containers/Bundle/Application/34E51961-4516-4478-AA59-579342D8D3A5/WebScoketTest.app/WebScoketTest
    
    Reason: image not found
    

    仔细看错误原因,是没有找到framework文件包,解决方法是:
    TARGETS -> Build Phases -> New Copy Files


    接着再点击下面+号,选择自定义的framework


    在arm64的环境下,运行会报错



    把TARGETS -> Build Settings -> Enable Bitcode设置为NO


    接下来,Build Success!

    相关文章

      网友评论

      • feng55:拉取的视频变形怎么处理呢
      • AveryWang:您好,您编译的Webrtc_ios 包含降噪Audio_Processing的代码吗
      • WillyGeek:webrtc支持cocoapod导入了. 搜索googlewebrtc即可.
        AveryWang:@WillyGeek 我pod googlewebrtc,没引用到audio_processingd的代码 是换文件名了吗:sob:
        WillyGeek:@AveryWang 包含的,但如果单独使用模块,可能需要自己编译源码并提取
        AveryWang:googlewebrtc 不包含audio_processing的代码吗
      • 6fd4e5d130c4:你好,想问一下你降噪跟回声是怎么处理的
      • 6fd4e5d130c4:HHRdeiMac:src mj_dom$ gn gen out/ios_64 --args='target_os="ios" target_cpu="arm64"'
        -bash: gn: command not found
        想问一下这怎么解决:smile:
      • 南巷北往:亲,这个源码能不能分享一下?翻墙也翻不了,下载也下不了,很难受。。。
        范少:@MFJun 请问里面没有主动控制音频的模块了吗(降噪,增益等),还是已经集成到了录音里面
        6fd4e5d130c4:HHRdeiMac:src mj_dom$ gn gen out/ios_64 --args='target_os="ios" target_cpu="arm64"'
        -bash: gn: command not found
        想问一下这怎么解决:smile:
        MFJun:WebRTC源码太大,已经删除,编译后iOS版framework链接,https://github.com/MFJun/WebRTC_iOS
      • 今年27:gn gen out/ios_64 --args='target_os="ios" target_cpu="arm64"'
        报错:
        ERROR at //build/config/ios/ios_sdk.gni:100:21: Script returned non-zero exit code.
        _ios_sdk_result = exec_script(script_name, ios_sdk_info_args, "scope")
        ^----------
        Current dir: /Users/lenkeng/Documents/webrtc_build/webrtc/src/out/ios_64/
        Command: python -- /Users/lenkeng/Documents/webrtc_build/webrtc/src/build/config/mac/sdk_info.py iphoneos
        Returned 1.
        stderr:

        xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
        Traceback (most recent call last):
        File "/Users/lenkeng/Documents/webrtc_build/webrtc/src/build/config/mac/sdk_info.py", line 70, in <module>
        FillXcodeVersion(settings)
        File "/Users/lenkeng/Documents/webrtc_build/webrtc/src/build/config/mac/sdk_info.py", line 26, in FillXcodeVersion
        lines = subprocess.check_output(['xcodebuild', '-version']).splitlines()
        File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 573, in check_output
        raise CalledProcessError(retcode, cmd, output=output)
        subprocess.CalledProcessError: Command '['xcodebuild', '-version']' returned non-zero exit status 1

        See //build/config/sysroot.gni:67:3: whence it was imported.
        import("//build/config/ios/ios_sdk.gni")
        ^--------------------------------------
        See //build/config/linux/pkg_config.gni:5:1: whence it was imported.
        import("//build/config/sysroot.gni")
        ^----------------------------------
        See //BUILD.gn:15:1: whence it was imported.
        import("//build/config/linux/pkg_config.gni")
        ^-------------------------------------------
        楼主有没有解决办法
      • iOS大神进阶:你好,我的是老版本的webRTC,脚本build_ios_libs.sh也是老版本的。你能给我发个你的脚本吗。邮箱qb13269127379@126.com,谢谢了
        iOS大神进阶:@MFJun 我试试
        MFJun:@iOS大神进阶 编译脚本和源码我已经删除了,你可以试试手动编译,参考5.1步骤
        iOS大神进阶:我的脚本报找不到c++的方法:
        /Users/mac/Desktop/copy/PingshowDeveloper/webrtcNative/src/third_party/llvm-build/Release+Asserts/include/c++/v1/cstdio:128:9: error: no member named 'fgetc' in the global namespace
        using ::fgetc;
        像这种。你知道哪的问题吗
      • 鱼嘿蛮仁:你好。我的webrtc和百度地图sdk也冲突了。请问你编译webrtc有什么操作吗?是移除了什么库吗?
        MFJun:https://github.com/MFJun/WebRTC_iOS这个demo里的WebRTC和openssl不冲突,你可以试试
      • 无风起个浪:module.js:544
        throw err;
        ^

        Error: Cannot find module '/Users/a100200/Downloads/WebRTC_iOS-master/server.js'
        at Function.Module._resolveFilename (module.js:542:15)
        at Function.Module._load (module.js:472:25)
        at Function.Module.runMain (module.js:682:10)
        at startup (bootstrap_node.js:191:16)
        at bootstrap_node.js:613:3
        这个错怎么解决啊,大神,忘回复
        无风起个浪:@MFJun 谢谢,这个问题已解决
        MFJun:可能是npm未安装,npm install,或者环境配置错误
      • 兵来将挡水来我喝:你好,我下载以后执行gn gen out/ios_sim --args='target_os="ios" target_cpu="x64"',却报了gn.py: Could not find gn executable at: /Users/bang/Desktop/webrtc_build/webrtc/src/buildtools/mac/gn,该怎么解决呀
        iOS大神进阶:这个问题你解决了吗,我也碰到了这个问题,大蕉大神写的有点看不懂,你怎么做的?
        MFJun:https://daozhao.goflytoday.com/2016/11/webrtc-native-code-compile/
      • MinorUncle:请问我用fetch --nohooks webrtc_ios,然后gclient sync,然后各种报错是什么情况?解决了一个又一个,现在出现了个“Error: Command 'download_from_google_storage --no_resume --platform=darwin --no_auth --bucket chromium-gn -s src/buildtools/mac/gn.sha1' returned non-zero exit status 1 ”,不知道怎么解决
        MinorUncle:感谢回复。我是macos,也是直接用mac下载的,貌似跟你发的第一个连接有点相似,我去看看。感谢
        MFJun:@MinorUncle 我没有使用Ubuntu下载过,错误有可能和你Ubuntu系统有关,https://stackoverflow.com/questions/24301526/gclient-sync-fails-due-to-ssl3-certificate-verify-failed,建议你使用mac下载,或者看看这篇博客试试能找到解决方案不http://www.jianshu.com/p/c3264aa95091
      • 810cd68e3fc5:你好,请问下,可以在ubuntu上下载代码,然后拷贝到mac上编译吗???我要编译旧的分支M58,是直接fetch下来,然后checkout到该分支,再同步,这样的操作流程正确吗,急急急,望回复!
        MFJun:@810cd68e3fc5 可以
        810cd68e3fc5:@MFJun 谢谢回复,我现在用mac下载代码及编译,但是比较奇怪的是M57和M59版本都编过了,但是M58分支就是编译报错,错误log如下,我现在怀疑和本地的环境可能有关,但是又实在不知道什么原因,或者你们现在还有编webrtc ios的代码吗,有的话能否帮忙尝试编下58分支的代码,感激不尽。
        ninja: Entering directory `out/ios_64'
        [3587/3779] CXX obj/webrtc/video/video_tests/vie_encoder_unittest.o
        FAILED: obj/webrtc/video/video_tests/vie_encoder_unittest.o
        ../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD -MF obj/webrtc/video/video_tests/vie_encoder_unittest.o.d
        ../../webrtc/video/vie_encoder_unittest.cc:256:11: error: reading variable 'quality_scaling_' requires holding mutex 'local_crit_sect_' [-Werror,-Wthread-safety-analysis]
        if (quality_scaling_)
        ^
        ../../webrtc/video/vie_encoder_unittest.cc:270:38: error: writing variable 'quality_scaling_' requires holding mutex 'local_crit_sect_' exclusively [-Werror,-Wthread-safety-analysis]
        void SetQualityScaling(bool b) { quality_scaling_ = b; }
        ^
        2 errors generated.
        [3592/3779] CXX obj/webrtc/video/video_tests/vie_remb_unittest.o
        ninja: build stopped: subcommand failed.
        MFJun:没有在Ubuntu上试过,应该可以下载代码后拷贝,选择不同版本,可以gclient sync -r eeab9ccb2417cab18ae1681c6644c25fa4eadcd3,其中eeab9ccb2417cab18ae1681c6644c25fa4eadcd3是版本号,怎么获得版本号,参考第四步:获取WebRTC源码

      本文标题:iOS下载、编译WebRTC及demo

      本文链接:https://www.haomeiwen.com/subject/ybyjrxtx.html