目前兩個比較活躍的開源WebRTC實現.
項目地址是: https://code.google.com/p/webrtc/
項目地址是: https://github.com/EricssonResearch/openwebrtc
我們戴維營教育為了給學生實戰項目中運用WebRTC視頻通話技術,選擇Google的WebRTC項目來構建iOS App的開發框架,因為目前Chrome瀏覽器和Firefox瀏覽器的WebRTC支持都是采用該項目.那么問題就來了,既然瀏覽器里都支持了WebRTC,那我們再去移植編譯它到iOS平臺干嘛呢,直接用webview 不行? 對,還不行! Apple在這方面已經嚴重拖后腿了.不過他有他牛逼的Facetime技術,可以隨時隨地的視頻通話,但是他不開源,所以我們只能垂涎了. 故還是老老實實的移植WebRTC吧.非常幸運的是,Google 的Chromium項目開發者已經實現了其WebRTC的Objective-C的一套API了.
不過,丑話還是說在前頭好,要從零開始集成WebRTC到我們的App中中, 簡直就是噩夢;因為WebRTC項目和Chromium項目有一定的關聯依賴關系,而且這些項目都是跨平臺的大項目,采用了Google自己的一套編譯系統,相對我們日常的IDE來說要復雜的多.如果我們需要得到一個WebRTC的庫或者框架,我們就需要忘記Xcode IDE和Interface Builder這些高科技,我們要切換到終端環境下用命令行下的黑科技來征服這一切.
前提條件:
我們創建一個目錄專門來存放項目編譯工具和項目代碼倉庫等.確保該目錄所在磁盤可用空間至少有8~10G.打開系統的終端工具進入到Shell:
wuqiong:~ apple$mkdir -p $HOME/opensource/webrtc_build/在執行下面命令之前,請確保你已經連上快速VPN已經FQ了,或者你已經給git單獨配置了有效的socksFQ代理,如果你這些都不是問題,就當我沒說.
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的構建工具,在我們后續的編譯過程中也將使用它.為了命令行使用方便,我們把這些工具的路徑加入到系統環境變量PATH中去:
wuqiong:webrtc_build apple$echo "export PATH=$PWD/depot_tools:$PATH" > $HOME/.bash_PRofile然后需要關閉當前終端重新開啟一個來上面設置的環境變量生效.或者在現在終端執行入門命令在當前終端里加載生效:
wuqiong:webrtc_build apple$source $HOME/.bash_profile在我們的編譯工作目錄webrtc_build下創建一個webtrtc子目錄來存放代碼,請執行下面命令:
wuqiong:webrtc_build apple$ mkdir webrtcwuqiong:webrtc_build apple$ cd webrtc 在上面的檢查工作沒錯之后,我們就需要開始把WebRTC項目的代碼倉庫下載一份到本地來.由于其倉庫之大,大約一共需要下載6G+的東西.所以這一步非常需要有耐心.而且需要有穩定無障礙的互聯網. 執行如下命令然后吧:
wuqiong:webrtc apple$ gclient config --name src http://webrtc.googlecode.com/svn/trunkwuqiong:webrtc apple$ echo "target_os = ['ios']" >> .gclientwuqiong:webrtc apple$ gclient sync --forceFQ快的去喝咖啡,慢的去約妹子吧.辦完事情之后回來如果上面的命令都一切順利,我們就可以往下走去開始編譯了. (為了方便大家,我已經把webrtc_build目錄打包備份,這樣大家可以省去大量的代碼下載時間.打包文件有5G,正在尋找網盤存放,隨后公布.)
到了這一步,源碼應該已經下載好了.這些源碼可以編譯為好幾個平臺,OS X, linux, Windows, Android, iOS等.這里我們只需要編譯iOS平臺的WebRTC,并制作成一個iOS的開發框架.這里我們不能用Xcode工具,因為這些項目壓根就不支持XCode.我們需要在終端命令行環境下去搞定這一切!
首先,為了我們裝逼玩黑武器,我們需要在webrtc的項目代碼目錄下創建一個腳本, 這個腳本就是我為了簡化命令的復雜度和提高使用的方便性專門編寫的一個一鍵框架編譯腳本,這個腳本就是今天的核心黑科技了.先創建一個空文件,然后賦予執行權限:
wuqiong:webrtc apple$ touch build_webrtc.shwuqiong:webrtc apple$ chmod +x build_webrtc.sh然后用編輯器打開編輯剛剛創建的腳本文件,把如下腳本粘貼進去之后保存并關閉:
#!/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