標籤:http android 視頻播放 邊下邊播
本文簡單地分享一下在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轉移到檔案頭部,從而支援邊下載邊播放。
ffmpeg -i input.mp4 -movflags faststart output.mp4
(2)如果自己通過http GET請求邊下載邊解碼播放的話,則需要注意,音視頻資料的即時傳輸顯示與普通檔案的傳輸有很大的不同,接收到檔案資料流可以立馬寫磁碟,但是接收到一幀音視頻資料則必鬚根據時間戳記來決定何時送入解碼器解碼以及顯示,沒到時間,就得sleep,否則的話,播放過程會因為網路抖動而出現卡頓現象。
註:一般情況下,兩幀視頻的時間間隔 = 1000/幀率
5. 小結
關於Android中做HTTP邊下邊播的一些經驗就分享到這裡了,有任何疑問或者建議歡迎留言或者來信[email protected]交流,或者關注我的新浪微博 @盧_俊 擷取最新的文章和資訊。
本文出自 “對影成三人” 部落格,請務必保留此出處http://ticktick.blog.51cto.com/823160/1713220
Android HTTP邊下邊播