【視訊聊天】一個簡單demo
Android端程式:https://github.com/Zweo/VideoChat
系統架構示意圖
視訊聊天的的流程大致為:
1. 使用者A發起視訊聊天,將控制資訊發往排程伺服器,同時將A視訊流上傳流媒體伺服器;
2. 排程伺服器通過控制資訊找到對應的使用者B,B做出響應,將B方視訊流上傳到流媒體伺服器,返回響應資訊,並拉取A方視訊流。
3. A得到響應資訊,拉取B方視訊流,實現視訊聊天。
本demo中,無排程伺服器,只是一個簡單的demo,就直接使用預設知道對方的地址進行播放。
如A的地址為 {伺服器}/live/hello_1 ,B 為 {伺服器}/live/hello_2
流媒體伺服器
流媒體指以流方式在網路中傳送音訊、視訊和多媒體檔案的媒體形式。相對於下載後觀看的網路播放形式而言,流媒體的典型特徵是把連續的音訊和視訊資訊壓縮後放到網路伺服器上,使用者邊下載邊觀看,而不必等待整個檔案下載完畢。由於流媒體技術的優越性,該技術廣泛應用於視訊點播、視訊會議、遠端教育、遠端醫療和線上直播系統中。
本系統採用red5-server作為流媒體伺服器,具體部署可參考我另一文章red5,很簡單就能配置好使用了。
注意事項:rtmp使用的1985埠可能被防火牆攔截
Android端
拉流方式
ijkplayer Android和ios都可用,還支援多種視訊的硬解碼。
Github網址:https://github.com/Bilibili/ijkplayer
使用方式:具體來講很有些麻煩,暫時就不講了,可以檢視我的github上用直接封裝好的,庫檔案也封裝好了。佈局檔案中新增VideoView,設定拉流地址,即可播放。
mVideoView.setVideoPath(mVideoPath);
mVideoView.start();
在 ijkVideoView.java 中,設定如下,減小快取區大小,實現減小延時的效果。
// 設定快取區,減小延時
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);
ijkMediaPlayer.setOption(1, "probesize", 10240L);
ijkMediaPlayer.setOption(1, "flush_packets", 1L);
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);
ijkMediaPlayer.setOption(4, "framedrop", 1L);
推流方式
Github網址:https://github.com/runner365/android_rtmppush_sdk
使用方式:輸入推流地址,即可推流。呼叫RtmpStartMessage函式即開始推流, _rtmpUrl為儲存推流地址的變數,改變它即可改變推流地址。
Android 端,將兩方的庫結合起來,就可以實現一個簡單的視訊聊天程式了,一個用來推送,一個用於拉流。
我這裡整合好的Android程式可以見: https://github.com/Zweo/VideoChat
PC端
推流拉流方式很多,這裡就不詳述了。 主要就是播放視訊流地址,以及推送視訊流即可。