丟棄RTMP協議的FLASH視頻直播方案所踩過的坑

很久沒有寫博客了,最近一直在忙FLASH直播相關的事情,終於完成了階段性工作。先描述下我們的FLASH方案。我們主要用FLASH在瀏覽器展示實時遊戲直播視頻,視頻可以除了可以再WEB上觀看,也可以在語音客戶端觀看和手機觀看。開始我們採用基本的FLASH FMS/RTMP方式。測試下來有以下幾個問題:

1、上傳和觀看必須用FLASH,RTMP和FLASH本身很多細節無法掌控。

2、帶寬問題,FLASH編碼的視頻帶寬過大,視頻品質相同的情況下640P的分辨率(70 ~ 90KB/S)與用X264應用程序編碼(35 ~ 55KB/S)的同分辨率相比帶寬大30KB/S,這是不能接受的。

3、傳輸RTMP承載過於呆板和複雜,無法根據實時直播進行優化。

4、其他一些FLASH FMS上的問題。例如:嚴格時間戳問題、語音丟包問題、延遲問題等。


測試下來,無法跟我們現有的語音視頻應用軟件做很好的兼容。經過討論後,我們採用私有協議傳輸,前端用FLASH做展示。利用FLASH的TCP和FLV做一個仿應用程序的WEB客戶端。總體方案描述如下:

1.實時上傳視頻通過語音客戶端進行,客戶端用X264和HEAAC進行進行媒體編碼,通過私有的網絡協議上傳到媒體服務器上。

2.媒體服務器實現語音和視頻分離傳輸,爲什麼要分離傳輸呢?語音爲了防止延遲,採用的是UDP方式傳輸,允許丟包,也可以採用語音特有的QOS算法進行控制;視頻採用RUDP方式傳輸,不允許丟包,儘量減少延遲。分離傳輸還有一個好處就是可以根據語音和視頻帶寬特性調配具體的機房帶寬。

3、設計一個falsh gate服務來耦合WEB FLASH的接入。在這個網關上實現語音和視頻的合併、協議轉譯、FLASH的接入協議實現、FLASH的私有協議QOS保證、減少播放緩衝等待等。

4、實現一個WEB FLASH播放器。主要實現私有協議的接入、FLV緩衝播放、多路媒體管理、視頻JITTER BUFFER/語音JITTER BUFFER、核心C的模塊嵌入(SWC方式)、語音視頻同步、QOS評估和路線選擇、斷線重連等。

下圖是整個流數據的走向圖:



整個方案大概用了1個月實現,期間遇到了很多坑。如下:

1、在初期的實現的版本中,視頻在FLASH端感覺很卡,沒有丟包,在模擬客戶端中是完全正常的。我們查看FLV播放的幀,發現只有5幀被播放。後來我查看編碼器中的參數,發現在640P分辨率下用了H264的B幀編碼,從測試模擬程序來看,FLASH好像不支持B幀。把B幀去掉,進行測試,正常了。

2、視頻分包問題,在我們的客戶端傳輸網絡中,爲了兼容P2P,我們將一幀視頻數據以4K大小進行分包。因爲數據包是直接透傳到FLASH PLAYER上,必須在FLASH SWC中做組包。開始一直因爲組包方式不對,FLV播放無圖像或者出現馬賽克。後來嚴格調整時間戳和組包算法,正常了。時間戳一定要嚴格對齊,至少在FLV播放前是這樣的。

3、語音疊幀問題,我們採用HEAAC進行編碼,1秒鐘會產生22 ~ 23幀數據,在客戶端爲了減少UDP報文的數量,採用了3幀疊成一個語音報文,這樣時間戳在報文中是最後一幀數據的時間戳,在FLASH播放端處理的時候,開始以最後時間戳進行播放,聲音很鈍。後來進行測試和問題查找,發現在時間戳上,進行時間戳完全校驗,收到一個語音包後進行拆幀,第一幀的時間戳是TS - 2*44,第二幀的時間戳是TS - 44,第三幀是TS。進行測試,完全正常了。

4、語音採樣率的坑,我們在客戶端都是採用48KHZ的雙聲道採樣編碼,在FLASH PLAYER FLV完全無法聽到聲音。後來查找FLASH支持的採用,才發現只支持11KHZ,22KHZ,44.1KHZ採樣。但是我們的HEAAC中好像沒有支持44.1KHZ的採樣編碼。回過頭進行HEAAC的改造,把44.1KHZ的採用率編碼加上。進行測試,正常通過。

5、FLASH PLAYER播放器內存泄露問題。在長時間運行過程中,瀏覽器的內存越來越大,開始毫無頭緒。後來經過仔細查找,發現是SWC(flash 嵌入C模塊)有內存泄露。用工具經常排查,修改對應FLASH 嵌入C中的內存泄露問題,進行測試,內存正常。

6、FLASH POLICY FILE問題,在FLASH 使用TCP連接外網服務器時,做過網遊的同學應該知道有個策略驗證。我按照網絡上搜索的格式填寫回應後,FLASH還是拒絕工作。進行抓包查看,發現POLICY報文完全正確。查找ADOBE網站上的資料,發現在服務端的SOCKET必須用同步SOCKET進行POLICY迴應,客戶端纔會生效。因爲我們服務器採用的都是EPOLL ET模式,所以沒辦法。只好另外起一個監聽843端口的同步SOCKET線程進行POLICY響應。進行測試,正常了。


總結,FLASH私有協議視頻直播中,由於很多細節FLASH並沒有公開,在開發進度上會比FMS RTMP方案慢很多,成本也大很多。但一旦做成了,視頻直播的效果和服務器部署不會受FMS和RTMP的限制,可以做更多結合自身業務的優化。帶寬成本也小近30%。私有協議還有個一個好處就是可以做到多屏融合,移動端、WEB端、PC客戶端任意兼容。這是值得的。

發佈了39 篇原創文章 · 獲贊 76 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章