背景
最近工作需要做一款直播APP,恩是的,從
RTMP協議的實現開始到處理服務器高並發、負載均衡、客戶端播放器實現等等等.....
估計全部寫完我也到而立之年了吧......
BOSS們估計也是發現了我的困惑,所以打算
集成第三方sdk開發,現在大部分的直播產品都會借助第三方的直播技術,這樣也可以保證直播的質量。
最后着重測試的還是
阿里雲和樂視雲的第三方sdk,阿里雲的直播產品剛出不久,感覺文檔以及調試過程還不是很清晰,現在一直沒弄明白為啥推流推出去了但是另外一邊拉流拉不了,也不知道是播放器的問題還是咋的,用
戰旗的直播間測試就可以拉到流,希望有大牛可以在評論區告知一二。
本文講的是
樂視雲直播Demo的使用過程,感覺樂視在文檔邏輯上比阿里雲還是強很多的至少,條理清晰邏輯嚴謹,能讓新手很快找到方向。
那么本文的目的呢,是給出一個最簡單清晰的Demo整理路線,讓各位做到真正的1分鍾看懂實現集成樂視sdk的直播Demo實現過程。
樂視雲直播測試案例
- 進入移動直播"應用管理"界面,點擊創建應用,只需輸入名字、類型、平台就可以了,之后我們會看到幾個很重要的參數:推流域名、播放域名、發布點名稱(live)以及簽名密鑰,有了這幾個東西,我們就可以開始直播測試了。
應用名稱:包晴天直播
推流域名:17546.mpush.live.lecloud.com
播放域名:17546.mpull.live.lecloud.com
發布點名稱:live
簽名密鑰:V86NL7KWKW1SL530F1KN
直播推流與播放地址規則:rtmp://{推流域名}/發布點名稱/{直播流名稱}
直播流名稱可自定義使用,
可允許數字或字母的任意字符,但不超過50位。
- 我們可以進行清晰度選擇、錄制、安全等設置
轉碼后,播放流名稱的生成規則:流名稱+清晰度標識
清晰度標識說明,流暢:"_10",標清:"_13",高清:"_16",原畫:""。
例如:播放地址:rtmp://{域名}/發布點/{直播流名稱}
轉成高清碼率后,高清碼率的播放地址為:rtmp://{域名}/發布點/{直播流名稱_16}
- 推流端配置。打開手機的推流端應用,依次輸入推流域名,簽名密鑰,以及流名稱。然后點擊開始直播,就可以直播推流了。
- 播放端配置。只需設置播放地址即可,如【rtmp://17546.mpush.live.lecloud.com/live/bqt】
- 直播過程中,可對所有"直播流"進行控制

以上就是樂視雲Demo的全部步驟辣,剩下的開發過程都很簡單,從代碼中探索即可。
樂視推流端部分代碼(設置自己的參數)
/**
* 無皮膚版和有皮膚版的區別
* 無皮膚:SDK不去猜測你的業務邏輯。只是提供最基本的接口,比如開始推流、切換濾鏡、切換攝像頭等。
* 有皮膚:SDK提供一種業務邏輯的使用辦法。比如DEMO中展示的,你點擊按鈕就可以開始推流,點擊下方各個圖標就能實現功能切換等
*
*
* 1、所有推流SDK功能和最簡單的DEMO,可以直接查看RecorderTestActivity
* 其中:如果移動直播查看CameraView,雲直播查看LeCameraView
*
* 2、在AndroidManifest.xml 中,我們默認設置MainActivity的啟動方式,MainAcivity提供了漂亮的UI界面。
* 如果你需要看看 RecorderTestActivity 的運行效果,需要自己在AndroidManifest.xml中進行設置,使用RecorderTestActivity直接啟動就行了
*
* 3、對於我們提供的UI層,理論不建議修改,但是如果你們確實需要,也可以自己修改,但是出現任何BUG需要自己調試。
*/
public class MainActivity extends Activity {
// 移動直播【推流域名】,在官網移動直播創建應用后可拿到
private static final String DEFAULT_DOMAINNAME = "17546.mpush.live.lecloud.com";//216.mpush.live.lecloud.com
// 移動直播【推流簽名密鑰】,在官網移動直播創建應用后可拿到
private static final String DEFAULT_APPKEY = "V86NL7KWKW1SL530F1KN";//KIVK8X67PSPU9518B1WA
// 移動直播【推流地址】, 當用戶知道自己需要推流的地址后可以使用
private static final String DEFAULT_PUSHSTREAM = "rtmp://17546.mpush.live.lecloud.com/live/bqt";//rtmp://216.mpush.live.lecloud.com/live/demo
// 樂視雲直播推流【用戶ID】,用戶可以在官網用戶中心拿到。另外,我的UUID為yt1jdrioib
private static final String DEFAULT_LETV_USERID = "835278";//800053
//樂視雲直播推流【用戶私鑰】,用戶可以在官網用戶中心拿到
private static final String DEFAULT_LETV_APPKEY = "14659a5bf736682623ca3f2f69129a16";//60ca65970dc1a15ad421d46f524b99b7
//樂視【雲直播推流ID】,用戶開通雲直播功能,可以在創建活動后拿到
private static final String DEFAULT_LETV_STREAMID = "A2016120500000gx";
//默認流名稱使用的是設備的IMEI號
private String default_streamid = "IMEI";
技術實現層面
技術相對都比較成熟,設備也都支持硬編碼。
github上有現成的開源實現,
推流、美顏、水印、彈幕、點贊動畫、濾鏡、播放都有。技術其實不是很難,而且現在很多雲廠商都提供SDK,
七牛雲、金山雲、樂視雲、騰訊雲、百度雲、斗魚直播伴侶推流端,功能幾乎都是一樣的,沒啥亮點,不同的是整個直播平台服務差異和接入的簡易性。后端現在
RTMP/HTTP-FLV 清一色,App掛個源站直接接入雲廠商或CDN就OK。
直播優化層面
其實最難的難點是
提高首播時間、服務質量Qos(Quality of Service),如何在丟包率20%的情況下還能保障穩定、流暢的直播體驗,需要考慮以下方案:
- 1.為加快首播時間,收流服務器主動推送 GOP :(Group of Pictures:策略影響編碼質量)。所謂GOP,意思是畫面組,一個GOP就是一組連續的畫面至邊緣節點,邊緣節點緩存 GOP,播放端則可以快速加載,減少回源延遲
- 2.GOP丟幀,為解決延時,為什么會有延時,網絡抖動、網絡擁塞導致的數據發送不出去,丟完之后所有的時間戳都要修改,切記。要不客戶端就會卡一個 GOP的時間,是由於 PTS(Presentation Time Stamp,PTS主要用於度量解碼后的視頻幀什么時候被顯示出來) 和 DTS 的原因,或者播放器修正 DTS 和 PTS 也行(推流端丟GOD更復雜,丟 p 幀之前的 i 幀會花屏)
- 3.純音頻丟幀,要解決音視頻不同步的問題,要讓視頻的delta增量到你丟掉音頻的delta之后,再發音頻,要不就會音視頻不同步
- 4.源站主備切換和斷線重連
- 5.根據TCP擁塞窗口做智能調度,當擁塞窗口過大說明節點服務質量不佳,需要切換節點和故障排查
- 6.增加上行、下行帶寬探測接口,當帶寬不滿足時降低視頻質量,即降低碼率
- 7.定時獲取最優的推流、拉流鏈路IP,盡可能保證提供最好的服務
- 8.監控必須要,監控各個節點的Qos狀態,來做整個平台的資源配置優化和調度
- 9.如果產品從推流端、CDN、播放器都是自家的,保障 Qos 優勢非常大
- 10.當直播量非常大時,要加入集群管理和調度,保障 Qos
- 11.播放端通過增加延時來減少網絡抖動,通過快播來減少延時。
運營成本和客戶體驗
根據網上的數據,斗魚 TV 為 3 億人民幣,戰旗 TV 為 1.5 億人民幣,龍珠為 1.2 億人民幣,虎牙為 3000 萬 + 人民幣。
運營和推廣:這個就比較燒錢了,一些做移動直播、游戲直播、秀場直播的A輪至少得上千萬。
用戶體驗:
流暢、不卡頓、不花屏、斷線重連、丟包策略、首畫加載速度、豐富的禮物系統,為了提高用戶體驗,可以在后台加載其他頁面數據,但要在用戶體驗和內存優化方面找到平衡點。
流媒體傳輸
- TCP:TCP為點對點的協議,雖然能保證了數據傳輸的可靠性,但是對服務器資源耗費較大,在數據流大的場合難以保證數據流傳輸的實時性。
- UDP:UDP為不可靠傳輸協議,不需要維護連接狀態,也不認為每個數據包都必須到達接受端,因此網絡負荷比TCP小,傳輸速度也要比TCP快;但在網絡越擁擠時,越有更多的數據包丟失。
- RTMP:RTMP一個專門為高效傳輸視頻、音頻和數據而設計的協議,它通過建立一個二進制TCP連接或者連接HTTP隧道實現實時的視頻和聲音傳輸。
- FFmpeg:FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。

備用服務器
給沒架設服務器的朋友來一套福利:備用服務器地址(親測可用):
rtmp://live.hkstv.hk.lxdns.com:1935/live/stream123
rtmp://live.hkstv.hk.lxdns.com:1935/live/hks
(將hks名稱改成其他的,比如aaa)
rtmp://202.69.69.180:443/live/aaa
(rtmp://202.69.69.180:443/webcast/bshdlive-pc)
rtmp://v1.one-tv.com:1935/live/aaa(rtmp://v1.one-tv.com:1935/live/mpegts.stream)
rtmp://203.207.99.19:1935/live/aaa(rtmp://203.207.99.19:1935/live/CCTV1)
rtmp://202.117.80.19:1935/live/aaa
(rtmp://202.117.80.19:1935/live/live4)
rtmp://ams.studytv.cn/live/aaa
(rtmp://ams.studytv.cn/livepkgr/264)
rtmp://60.174.36.89:1935/live/aaa
(rtmp://60.174.36.89:1935/live/vod3)