播放器適配經驗總結——Android

Android的流媒體協議支持不太好,標準只支持RTSP和MP4overHTTP。因爲MP4頭部大,啓動會比較慢,另外MP4也不適合做直播。當然基於Android的開放性,完全可以自己做一個播放器,難點是要做解碼和顯示的適配,Android機型太多,這個適配工作量比較大。Android升級到4.0版本應該支持HLS,目前也有一些設備廠商在2.x版本上支持的HLS。但是要做統一的產品,還是隻能用RTSP,畢竟2.x的設備仍然是市場的主流。

1、不能播放

現象:播放器打開後,緩衝一段時間,彈出播放失敗

範圍:所有Android設備,但是vlcplayer可以播放

原因:H.264視頻的SPS、PPS沒有發送。雖然在DESCRIBE的sdp應答裏面已經通過config字段返回了SPS、PPS,但是Android上的播放器忽略了這個,還是需要在RTP流中增加冗餘數據。

方案:RTP流中增加冗餘的SPS、PPS數據

備註:實現完RTSP服務端後,在VLC上測試可以播放,但是在所有Android設備都不能播,尋找各種原因都沒有結果,一度都覺得乾脆放棄算了。這件事告訴了我們:永不放棄,在一次次失敗後,你離成功就只有一步了。

2、無圖像

現象:播放器打開後,有聲音無圖像

範圍:部分影片,部分設備

原因:通過分析影片,發現不能播放的都是H.264HighProfile,設備硬件不支持。

方案:改成H.264Baseline壓縮

備註:有一個設備能夠播放H.264HighProfile(Mp4文件),都是通過RTSP就不能播放H.264HighProfile,可能是播放器做的有問題。

3、音視頻不同步

現象:播放一段時間後音視頻不同步

範圍:部分設備

原因:時間上比較長,難定位

方案:

4、不能播放

現象:播放器打開後,直接顯示失敗

範圍:一款三星手機

原因:在RTSPDESCRIBE請求後,直接失敗,懷疑與SDP有關。後來通過與Live555對比,發現SDP中的各行順序不一樣,調整t和c的順序,可以播放,但是原因不明。

方案:調整SDP中t和c的順序,t在前,c在後

備註:在適配中,遇到不能播放的設備時,我們經常用Live555作對比,發現Live555確實不播放設備都能播放,也許是它實現得更符合協議標準。

5、畫面卡頓

現象:播放時,畫面會很慢,滯後於聲音,聲音正常。

範圍:三星的手機

原因:H.264中,幀的時間戳有DTS和PTS兩個,RTP的時間戳一般採用PTS,是不連續的。但是三星的播放器好像利用RTP的時間戳在做播放控制,時間戳不連續導致問題。更具體原因不明。

方案:修改RTP時間戳爲DTS,只針對三星播放器

6、鳥語

現象:播放時,聲音不正常,說話聲音像鳥叫一樣,很快。

範圍:HTC的一款手機

原因:在將FLV文件通過RTP發送時,因爲FLV的time_scale是1000,所以RTP的time_scale也設置爲1000,但是按照RFC文檔,音頻的time_scale應該用採樣率。

方案:修改time_scale,時間戳根據採樣率重新計算。

備註:因爲每個音頻sample一般是1024個採樣點,所以新的時間戳只要每幀增加1024即可。

7、一直加載

現象:播放一直處於加載過程中

範圍:採用小米UI的手機

原因:RTSP服務端沒有發送RTCPSenderReport

方案:發送RTCPSenderReport

8、一直加載2

現象:播放一直處於加載過程中

範圍:三星的一款手機

原因:如果只發送音頻,或者只發送視頻,都能夠播放。達爾文服務器能播,區別是音頻幀合併了,一個RTP報文中有多個音頻幀。沒有進一步排查原因。

方案:

備註:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章