1. 程式人生 > >Android HTTP邊下邊播

Android HTTP邊下邊播

本文簡單地分享一下在Android平臺做HTTP邊下載邊播放的一些經驗,希望對初學者有所幫助。 

1. 為什麼播放器在播放視訊檔案的時候,都知道該怎麼去解碼、該以怎樣的時間間隔去顯示每一幀呢? 因為無論是mp4、avi、flv、mkv還是其他格式的音視訊檔案,都存在一個稱為metadata的資料塊,記錄了當前檔案的影象尺寸、編碼格式、幀率、位元速率等資訊,播放器可以通過解析metadata得到這些資訊。

 2. 迅雷邊下邊播的原理是怎樣的? 迅雷在邊下邊播的時候,不會像往常一樣根據資源連結數優先排序進行亂序下載,而是會首先去下載含有metedata的資料塊,從而配置好解碼器和顯示間隔等邏輯,然後保證至少有一個執行緒順序地獲取/下載即將播放的資料塊,從而實現邊下邊播。

 3. Android中如何實現邊下邊播? Android的VideoView是支援http協議的邊下邊播的,只需要將遠端http伺服器上的視訊檔案的HTTP URL地址通過 VideoView.setVideoPath 傳進去,start之後VideoView就會直接邊下載邊解碼播放了。 不過VideoView支援的視訊格式有限,一般只支援mp4、3gp、avi格式 因此,你也可以直接通過"HTTP GET"請求進行檔案下載,得到檔案的metedata之後,解析出該檔案的編碼、幀率等資訊(例如:mp4碼流的話,可以通過《Android中如何提取和生成mp4檔案》這篇文章提供的方法進行音視訊資料的解耦),然後邊下載邊送入軟/硬解碼器進行解碼,最後通過SurfaceView將解碼後的資料顯示出來,比較複雜,相當於自己做流媒體播放器了。 

4. 需要注意的坑 (1) 不是所有的mp4檔案都支援通過HTTP協議邊下邊播,因為有的mp4檔案的metadata資料塊在檔案尾部,只有下載完整個檔案之後才能成功解析。 注:對於metadata資料塊在檔案尾部的mp4檔案,可以通過ffmpeg的qt-faststart工具來轉換,或者直接使用如下ffmpeg命令將metadata轉移到檔案頭部,從而支援邊下載邊播放。 1 ffmpeg -i input.mp4 -movflags faststart output.mp4 (2)如果自己通過http GET請求邊下載邊解碼播放的話,則需要注意,音視訊資料的實時傳輸顯示與普通檔案的傳輸有很大的不同,接收到檔案資料流可以立馬寫磁碟,但是接收到一幀音視訊資料則必須根據時間戳來決定何時送入解碼器解碼以及顯示,沒到時間,就得sleep,否則的話,播放過程會因為網路抖動而出現卡頓現象。 1 注:一般情況下,兩幀視訊的時間間隔 = 1000/幀率 

5. 小結 關於Android中做HTTP邊下邊播的一些經驗就分享到這裡了,有任何疑問或者建議歡迎留言或者來信[email protected]交流 在這裡我們使用了bootstrapValidator,語法很簡單,就不解釋了。