手把手教你10分鐘快速搭建webrtc
時間:2023-04-21 15:09:02 | 來源:網(wǎng)站運(yùn)營
時間:2023-04-21 15:09:02 來源:網(wǎng)站運(yùn)營
手把手教你10分鐘快速搭建webrtc:
android:
GitHub - logan39522361/webrtc_android: A webrtc android demo.
ios:
目前由于缺少mac與ios設(shè)備,所以無法開展,后續(xù)補(bǔ)上
pc端(h5)與信令服務(wù)器(java):
GitHub - logan39522361/webrtc_signaling_server: A webrtc demo,signaling funcion.
1、使用coturn(谷歌官方STUN服務(wù))作為STUN服務(wù),完成NAT檢測與流媒體中繼
2、使用自研信令服務(wù)器(java springboot)
3、客戶端目前開發(fā)了安卓與h5(chrome),實現(xiàn)了app to app、app to pc、pc to pc的點(diǎn)對點(diǎn)通信,還沒有實現(xiàn)多人視頻
ps:
1、pc的h5使用谷歌自帶的adapter.js可以使用屏幕共享功能,在有攝像頭或者麥克風(fēng)的情況下也可以實現(xiàn)視頻通話
2、目前pc自測過chrome支持良好,理論上火狐應(yīng)該也行,safari應(yīng)該需要打開一些設(shè)置才行(缺少蘋果設(shè)備無法測試)
webrtc的前世今生
大白話就是兩大點(diǎn):
1、webrtc:是由谷歌主導(dǎo)且開源的流媒體傳輸、編解碼的框架。
2、傳輸方式:在非對稱型NAT的情況下,客戶使用自己的帶寬實現(xiàn)點(diǎn)對點(diǎn)流媒體傳輸(降低服務(wù)器壓力),在對稱型NAT的情況下使用服務(wù)器中繼傳輸。
1、NAT類型檢測服務(wù)器
2、流媒體中繼服務(wù)器
2、信令交換服務(wù)器
3、客戶端流媒體編解碼(谷歌買了一家專門做音視頻的編解碼公司,并開源了其代碼,一般app使用這個公司的c庫實現(xiàn),谷歌瀏覽器自帶這個c庫)
環(huán)境:
服務(wù)器:centos7.9 jdk1.8
pc端:win10 jdk1.8
安卓端:android9.0
【學(xué)習(xí)地址】:FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發(fā)
【文章福利】:免費(fèi)領(lǐng)取更多音視頻學(xué)習(xí)資料包、大廠面試題、技術(shù)視頻和學(xué)習(xí)路線圖,資料包括(C/C++,Linux,F(xiàn)Fmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點(diǎn)擊1079654574加群領(lǐng)取哦~
1、安裝依賴
yum install git && yum install gcc && yum install gcc-c++ && yum install openssl && yum install openssl-devel && yum install libevent2 && yum install libevent-devel
2、獲取源碼
wget
https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz3、編譯與安裝
tar -zxvf 4.5.1.1.tar.gz && cd coturn-4.5.1.1 && ./configure && make && make install
4、修改配置
cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf
vim /usr/local/etc/turnserver.conf
5、設(shè)置文件內(nèi)容:
listening-port=3478 listening-ip=【你的centos服務(wù)器局域網(wǎng)ip】 listening-device=eth0 tls-listening-port=5349 external-ip=【你的外部ip】 user=admin_test:123456 cli-password=123456 log-file=/app/logs/turn.log pidfile=/app/logs/pid_turnserver
6、生成證書
cd /usr/local/etc/
openssl req -x509 -newkey rsa:2048 -keyout /usr/local/etc/turn_server_pkey.pem -out /usr/local/etc/turn_server_cert.pem -days 99999 -nodes
7、啟動coturn
turnserver -o -a -f -v -r shenzhen -user=admin_test:123456 -c /usr/local/etc/turnserver.conf
8、安裝完成后使用 ice測試,檢測stun服務(wù)器是否啟動成功(Chrome瀏覽器在測試的時候有問題,請用Firefox瀏覽器測試!)
填寫自己的服務(wù)器信息點(diǎn)擊add Server
然后點(diǎn)擊gather
出現(xiàn)done即表示成功
啟動springboot即可
- 具體步驟03啟動app與h5客戶端進(jìn)行通話
- h5與h5通信(屏幕共享)
1、 打開信令服務(wù)器項目的other目錄的webrtc_share.html ,修改 :
ws_url 為你的websocket地址
ice_config 變量為你自己coturn的配置
2、打開兩個 webrtc_share.html
兩個頁面分別點(diǎn)擊step01準(zhǔn)備peer
客戶A輸入客戶B的id,客戶A點(diǎn)擊step02建立連接
3、效果如下:
- app與h5通信(app攝像頭與麥克風(fēng),h5為屏幕共享)
1、使用android studio打開安卓項目,修改 com.kiddo.webrtcdemo.cons.UrlCons ws、http、stun、turn信息為你的配置
2、pc端打開webrtc_share.html
2.1 修改 :
ws_url 為你的websocket地址
ice_config 變量為你自己coturn的配置
2.2 然后,點(diǎn)擊step01準(zhǔn)備peer,記得一定要點(diǎn)擊“分享系統(tǒng)中的音頻”,因為sdp協(xié)議需要有對等關(guān)系,在屏幕共享這一塊我還沒改好兼容性,其實是可以不共享音頻的,后續(xù)會進(jìn)行優(yōu)化
3、編譯并打開app,刷新用戶列表,點(diǎn)擊呼叫即開始通話,如下:
安卓端,效果如下:
pc端,效果如下:
1、app的實現(xiàn)底層是谷歌編譯的c庫,有兩個版本:
libjingle_peerconnection(已過時,ios用黑蘋果親測過有些功能已無法使用)
GoogleWebRTC 目前安卓與ios都使用這個
2、sdp協(xié)議這一塊大家一定要吃透,特別是有需要不同業(yè)務(wù)、不同終端情況下建立通信的情況
比如pc端(h5)只使用麥克風(fēng)與app端使用攝像頭+麥克風(fēng)進(jìn)行通話時,如果h5是發(fā)起方(create offer),h5在getUserMedia之后,需要手動修改sdp,加上 addTransceiver("video", {direction: "recvonly"}); 使sdp里帶有video信息
3、如果想使用動態(tài)密碼的話,第4的配置要改成如下
listening-port=3478listening-ip=【centos服務(wù)器局域網(wǎng)ip】tls-listening-port=5349external-ip=【外部公網(wǎng)ip】lt-cred-mechuse-auth-secretstatic-auth-secret=testrealm=beijinglog-file=/app/logs/turn.logpidfile=/app/logs/turn_pid
啟動指令改成如下
turnserver -o -a -f -v -r beijing -c /usr/local/etc/turnserver.conf
生成密碼的java代碼
生成用戶名:
//過期時間360sString turnUsername = System.currentTimeMillis() / 1000 + 7200 + ":" + userId;
生成密碼:
import org.slf4j.Logger;import org.slf4j.LoggerFactory; import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec; public class TurnPassWordUtil { private static final Logger logger = LoggerFactory.getLogger(TurnPassWordUtil.class); private static final String MAC_NAME = "HmacSHA1"; private static final String ENCODING = "UTF-8"; private static byte[] hmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception { byte[] data = encryptKey.getBytes(ENCODING); // 根據(jù)給定的字節(jié)數(shù)組構(gòu)造一個密鑰,第二參數(shù)指定一個密鑰算法的名稱 SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); // 生成一個指定 Mac 算法 的 Mac 對象 Mac mac = Mac.getInstance(MAC_NAME); // 用給定密鑰初始化 Mac 對象 mac.init(secretKey); byte[] text = encryptText.getBytes(ENCODING); // 完成 Mac 操作 return mac.doFinal(text); } public static String getPassWord(String turnUsername) { try { return Base64Util.encodeByCommons(hmacSHA1Encrypt(turnUsername, "test")); } catch (Exception e) { logger.error("turn服務(wù)器密碼加密失敗: []", e); } return null; }}
版權(quán)聲明:本文為CSDN博主「有故事的貓先生」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:手把手教你10分鐘快速搭建webrtc_有故事的貓先生的博客-CSDN博客_webrtc 服務(wù)器搭建