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報文中有多個音頻幀。沒有進一步排查原因。
方案:
備註: