溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Webrtc的iOS框架編譯

發(fā)布時(shí)間:2020-07-16 16:26:42 來源:網(wǎng)絡(luò) 閱讀:2476 作者:wcrane 欄目:移動開發(fā)

1.WebRTC的iOS框架的選擇

目前兩個(gè)比較活躍的開源WebRTC實(shí)現(xiàn).

  • Google WebRTC:

項(xiàng)目地址是: https://code.google.com/p/webrtc/

  • Ericsson Research OpenWebRTC:

項(xiàng)目地址是: https://github.com/EricssonResearch/openwebrtc

我們戴維營教育為了給學(xué)生實(shí)戰(zhàn)項(xiàng)目中運(yùn)用WebRTC視頻通話技 術(shù),選擇Google的WebRTC項(xiàng)目來構(gòu)建iOS App的開發(fā)框架,因?yàn)槟壳癈hrome瀏覽器和FireFox瀏覽器的WebRTC支持都是采用該項(xiàng)目.那么問題就來了,既然瀏覽器里都支持了 WebRTC,那我們再去移植編譯它到iOS平臺干嘛呢,直接用webview 不行? 對,還不行! Apple在這方面已經(jīng)嚴(yán)重拖后腿了.不過他有他牛逼的Facetime技術(shù),可以隨時(shí)隨地的視頻通話,但是他不開源,所以我們只能垂涎了. 故還是老老實(shí)實(shí)的移植WebRTC吧.非常幸運(yùn)的是,Google 的Chromium項(xiàng)目開發(fā)者已經(jīng)實(shí)現(xiàn)了其WebRTC的Objective-C的一套API了.

不過,丑話還是說在前頭好,要從零開始集成WebRTC到我們的App中中, 簡直就是噩夢;因?yàn)閃ebRTC項(xiàng)目和Chromium項(xiàng)目有一定的關(guān)聯(lián)依賴關(guān)系,而且這些項(xiàng)目都是跨平臺的大項(xiàng)目,采用了Google自己的一套編譯系 統(tǒng),相對我們?nèi)粘5腎DE來說要復(fù)雜的多.如果我們需要得到一個(gè)WebRTC的庫或者框架,我們就需要忘記Xcode IDE和Interface Builder這些高科技,我們要切換到終端環(huán)境下用命令行下的黑科技來征服這一切.

2.開始WebRTC×××

前提條件:

  • 我現(xiàn)在用的Macbook,8G內(nèi)存,運(yùn)行OS X 10.9.5.

  • 安裝最新的git和subversions并確保其可正常工作.

  • Xcode 6.1.1 和 Command Line Tools.

  • 中國大陸用戶額外要求,快速的×××,或者快速的shadowsocks服務(wù).(×××和給git和svn以及curl設(shè)置代理等).

2.1 創(chuàng)建一個(gè)編譯目錄

我們創(chuàng)建一個(gè)目錄專門來存放項(xiàng)目編譯工具和項(xiàng)目代碼倉庫等.確保該目錄所在磁盤可用空間至少有8~10G.打開系統(tǒng)的終端工具進(jìn)入到Shell:

wuqiong:~ apple$mkdir -p $HOME/opensource/webrtc_build/

2.2 下載Chromium的depot工具

在執(zhí)行下面命令之前,請確保你已經(jīng)連上快速×××已經(jīng)×××了,或者你已經(jīng)給git單獨(dú)配置了有效的socks×××代理,如果你這些都不是問題,就當(dāng)我沒說.

wuqiong:~ apple$cd $HOME/opensource/webrtc_build/
wuqiong:webrtc_build apple$git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

這是一套Google用來編譯Chromium或者WebRTC的構(gòu)建工具,在我們后續(xù)的編譯過程中也將使用它.為了命令行使用方便,我們把這些工具的路徑加入到系統(tǒng)環(huán)境變量PATH中去:

wuqiong:webrtc_build apple$echo "export PATH=$PWD/depot_tools:$PATH" > $HOME/.bash_profile

然后需要關(guān)閉當(dāng)前終端重新開啟一個(gè)來上面設(shè)置的環(huán)境變量生效.或者在現(xiàn)在終端執(zhí)行入門命令在當(dāng)前終端里加載生效:

wuqiong:webrtc_build apple$source $HOME/.bash_profile

2.3 下載WebRTC的源碼

在我們的編譯工作目錄webrtc_build下創(chuàng)建一個(gè)webtrtc子目錄來存放代碼,請執(zhí)行下面命令:

wuqiong:webrtc_build apple$ mkdir webrtc
wuqiong:webrtc_build apple$ cd webrtc

在上面的檢查工作沒錯(cuò)之后,我們就需要開始把WebRTC項(xiàng)目的代碼倉庫下載一份到本地來.由于其倉庫之大,大約一共需要下載6G+的東西.所以這一步非常需要有耐心.而且需要有穩(wěn)定無障礙的互聯(lián)網(wǎng). 執(zhí)行如下命令然后吧:

wuqiong:webrtc apple$ gclient config --name src http://webrtc.googlecode.com/svn/trunk
wuqiong:webrtc apple$ echo "target_os = ['ios']" >> .gclient
wuqiong:webrtc apple$ gclient sync --force

×××快的去喝咖啡,慢的去約妹子吧.辦完事情之后回來如果上面的命令都一切順利,我們就可以往下走去開始編譯了. (為了方便大家,我已經(jīng)把webrtc_build目錄打包備份,這樣大家可以省去大量的代碼下載時(shí)間.打包文件有5G,正在尋找網(wǎng)盤存放,隨后公布.)

2.4 編譯WebRTC.framework

到了這一步,源碼應(yīng)該已經(jīng)下載好了.這些源碼可以編譯為好幾個(gè)平臺,OS X, Linux, Windows, Android, iOS等.這里我們只需要編譯iOS平臺的WebRTC,并制作成一個(gè)iOS的開發(fā)框架.這里我們不能用Xcode工具,因?yàn)檫@些項(xiàng)目壓根就不支持 XCode.我們需要在終端命令行環(huán)境下去搞定這一切!

首先,為了我們裝逼玩黑武器,我們需要在webrtc的項(xiàng)目代碼目錄下創(chuàng)建一個(gè)腳本, 這個(gè)腳本就是我為了簡化命令的復(fù)雜度和提高使用的方便性專門編寫的一個(gè)一鍵框架編譯腳本,這個(gè)腳本就是今天的核心黑科技了.先創(chuàng)建一個(gè)空文件,然后賦予執(zhí)行權(quán)限:

wuqiong:webrtc apple$ touch build_webrtc.sh
wuqiong:webrtc apple$ chmod +x build_webrtc.sh

然后用編輯器打開編輯剛剛創(chuàng)建的腳本文件,把如下腳本粘貼進(jìn)去之后保存并關(guān)閉:

#!/bin/bash
# Script to build WebRTC.framework for iOS
# Copyright (C) 2015 戴維營教育  - All Rights Reserved
# Last revised 28/1/2015
#

function build_iossim_ia32() {
    echo "*** building WebRTC for the ia32 iOS simulator";
    export GYP_GENERATORS="ninja";
    export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=ia32";
    export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios_ia32";
    export GYP_CROSSCOMPILE=1;
    pushd src;
    gclient runhooks;
    ninja -C out_ios_ia32/Release-iphonesimulator iossim AppRTCDemo;

    echo "*** creating iOS ia32 libraries";
    pushd out_ios_ia32/Release-iphonesimulator/;
    rm -f  libapprtc_signaling.a;
    popd;
    mkdir -p out_ios_ia32/libs;
    libtool -static -o out_ios_ia32/libs/libWebRTC-ia32.a out_ios_ia32/Release-iphonesimulator/lib*.a;
    strip -S -x -o out_ios_ia32/libs/libWebRTC.a -r out_ios_ia32/libs/libWebRTC-ia32.a;
    rm -f out_ios_ia32/libs/libWebRTC-ia32.a;
    echo "*** result: $PWD/out_ios_ia32/libs/libWebRTC.a";

    popd;
}

function build_iossim_x86_64() {
    echo "*** building WebRTC for the x86_64 iOS simulator";
    export GYP_GENERATORS="ninja";
    export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=x64 target_subarch=arm64";
    export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios_x86_64";
    export GYP_CROSSCOMPILE=1;
    pushd src;
    gclient runhooks;
    ninja -C out_ios_x86_64/Release-iphonesimulator iossim AppRTCDemo;

    echo "*** creating iOS x86_64 libraries";
    pushd out_ios_x86_64/Release-iphonesimulator/;
    rm -f  libapprtc_signaling.a;
    popd;
    mkdir -p out_ios_x86_64/libs;
    libtool -static -o out_ios_x86_64/libs/libWebRTC-x86_64.a out_ios_x86_64/Release-iphonesimulator/lib*.a;
    strip -S -x -o out_ios_x86_64/libs/libWebRTC.a -r out_ios_x86_64/libs/libWebRTC-x86_64.a;
    echo "*** result: $PWD/out_ios_x86_64/libs/libWebRTC.a";

    popd;
}

function build_iosdevice_armv7() {
    echo "*** building WebRTC for armv7 iOS devices";
    export GYP_GENERATORS="ninja";
    export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=armv7";
    export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios_armv7";
    export GYP_CROSSCOMPILE=1;
    pushd src;
    gclient runhooks;
    ninja -C out_ios_armv7/Release-iphoneos AppRTCDemo;

    echo "*** creating iOS armv7 libraries";
    pushd out_ios_armv7/Release-iphoneos/;
    rm -f  libapprtc_signaling.a;
    popd;
    mkdir -p out_ios_armv7/libs;
    libtool -static -o out_ios_armv7/libs/libWebRTC-armv7.a out_ios_armv7/Release-iphoneos/lib*.a;
    strip -S -x -o out_ios_armv7/libs/libWebRTC.a -r out_ios_armv7/libs/libWebRTC-armv7.a;
    echo "*** result: $PWD/out_ios_armv7/libs/libWebRTC.a";

    popd;
}

function build_iosdevice_arm64() {
    echo "*** building WebRTC for arm64 iOS devices";
    export GYP_GENERATORS="ninja";
    export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=arm64 target_subarch=arm64";
    export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios_arm64";
    export GYP_CROSSCOMPILE=1;
    pushd src;
    gclient runhooks;
    ninja -C out_ios_arm64/Release-iphoneos AppRTCDemo;

    echo "*** creating iOS arm64 libraries";
    pushd out_ios_arm64/Release-iphoneos/;
    rm -f  libapprtc_signaling.a;
    popd;
    mkdir -p out_ios_arm64/libs;
    libtool -static -o out_ios_arm64/libs/libWebRTC-arm64.a out_ios_arm64/Release-iphoneos/lib*.a;
    strip -S -x -o out_ios_arm64/libs/libWebRTC.a -r out_ios_arm64/libs/libWebRTC-arm64.a;
    echo "*** result: $PWD/out_ios_arm64/libs/libWebRTC.a";

    popd;
}

function combine_libs() 
{
    echo "*** combining libraries";
    lipo  -create   src/out_ios_ia32/libs/libWebRTC.a \
            src/out_ios_x86_64/libs/libWebRTC.a \
            src/out_ios_armv7/libs/libWebRTC.a \
            src/out_ios_arm64/libs/libWebRTC.a \
            -output libWebRTC.a;
    echo "The public headers are located in $PWD/src/talk/app/webrtc/objc/public/*.h";
}

function create_framework() {
    echo "*** creating WebRTC.framework";
    rm -rf WebRTC.framework;
    mkdir -p WebRTC.framework/Versions/A/Headers;
    cp ./src/talk/app/webrtc/objc/public/*.h WebRTC.framework/Versions/A/Headers;
    cp libWebRTC.a WebRTC.framework/Versions/A/WebRTC;

    pushd WebRTC.framework/Versions;
    ln -sfh A Current;
    popd;
    pushd WebRTC.framework;
    ln -sfh Versions/Current/Headers Headers;
    ln -sfh Versions/Current/WebRTC WebRTC;
    popd;
}

function clean() 
{
    echo "*** cleaning";
    pushd src;
    rm -rf out_ios_arm64 out_ios_armv7 out_ios_ia32 out_ios_x86_64;
    popd;
    echo "*** all cleaned";
}

function update()
{
    gclient sync --force
    pushd src
    svn info | grep Revision > ../svn_rev.txt
    popd
}

function build_all() {
    build_iossim_ia32 && build_iossim_x86_64 && \
    build_iosdevice_armv7 && build_iosdevice_arm64 && \
    combine_libs && create_framework;
}

function run_simulator_ia32() {
    echo "*** running webrtc appdemo on ia32 iOS simulator";
    src/out_ios_ia32/Release-iphonesimulator/iossim src/out_ios_ia32/Release-iphonesimulator/AppRTCDemo.app;
}

function run_simulator_x86_64() {
    echo "*** running webrtc appdemo on x86_64 iOS simulator";
    src/out_ios_x86_64/Release-iphonesimulator/iossim -d 'iPhone 6' -s '8.1'  src/out_ios_x86_64/Release-iphonesimulator/AppRTCDemo.app;
}

function run_on_device_armv7() {
    echo "*** launching on armv7 iOS device";
    ideviceinstaller -i src/out_ios_armv7/Release-iphoneos/AppRTCDemo.app;
    echo "*** launch complete";
}

function run_on_device_arm64() {
    echo "*** launching on arm64 iOS device";
    ideviceinstaller -i src/out_ios_arm64/Release-iphoneos/AppRTCDemo.app;
    echo "*** launch complete";
}

#運(yùn)行命令行參數(shù)中第一個(gè)參數(shù)所指定的Shell函數(shù)
$@


這個(gè)編譯腳本除了可以編譯WebRTC項(xiàng)目自帶的AppRTCDemo應(yīng)用外,還可以編譯出WebRTC.framework.

執(zhí)行如下命令來編譯我們所需要的全部:

wuqiong:webrtc apple$ ./build_webrtc.sh build_all

等上面命令完成之后,我們所需要的WebRTC框架就在當(dāng)前目錄下了.可以用ls命令查看之:

wuqiong:webrtc apple$ ls 
WebRTC.framework build_webrtc.sh  libWebRTC.a      src
wuqiong:webrtc apple$

第一個(gè)WebRTC.framework就是我們需要的框架了! 到此,我們的編譯任務(wù)就完成了! 不是吧..就這么簡單?不是說起來超級麻煩嗎?呵呵,裝逼結(jié)束. 繁瑣的部分已經(jīng)封裝到了shell腳本里頭去了.如果有興趣可以去研究一下這個(gè)腳本.

2.5 WebRTC.framework的依賴.

如果項(xiàng)目使用了該框架,那么編譯的時(shí)候需要在項(xiàng)目的Build Phases中添加如下庫和框架:

  • libstdc++.6.dylib

  • libsqlite3.dylib

  • libc++.dylib

  • libicucore.dylib

  • Security.framework

  • CFNetwork.framework

  • GLKit.framework

  • AudioToolbox.framework

  • AVFoundation.framework

  • CoreAudio.framework

  • CoreMedia.framework

  • CoreVideo.framework

  • CoreGraphics.framework

  • OpenGLES.framework

  • QuartzCore.framework

重要提示

目前Google官方代碼中在ARMv7平臺有VP8視頻編碼的stackoverflow問題,會直接導(dǎo)致程序崩潰,如需了解詳情并獲取補(bǔ)丁,請聯(lián)系戴維營教育,或者等幾天官方就會修復(fù)了。

本文檔由長沙戴維營教育整理。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI