Android HTTP邊下邊播

本文簡單地分享一下在Android平臺作HTTP邊下載邊播放的一些經驗,但願對初學者有所幫助。 1. 爲何播放器在播放視頻文件的時候,都知道該怎麼去解碼、該以怎樣的時間間隔去顯示每一幀呢? 由於不管是mp四、avi、flv、mkv仍是其餘格式的音視頻文件,都存在一個稱爲metadata的數據塊,記錄了當前文件的圖像尺寸、編碼格式、幀率、碼率等信息,播放器能夠經過解析metadata獲得這些信息。 2. 迅雷邊下邊播的原理是怎樣的? 迅雷在邊下邊播的時候,不會像往常同樣根據資源連接數優先排序進行亂序下載,而是會首先去下載含有metedata的數據塊,從而配置好解碼器和顯示間隔等邏輯,而後保證至少有一個線程順序地獲取/下載即將播放的數據塊,從而實現邊下邊播。 3. Android中如何實現邊下邊播? Android的VideoView是支持http協議的邊下邊播的,只須要將遠程http服務器上的視頻文件的HTTP URL地址經過 VideoView.setVideoPath 傳進去,start以後VideoView就會直接邊下載邊解碼播放了。 不過VideoView支持的視頻格式有限,通常只支持mp四、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邊下邊播的一些經驗就分享到這裏了,有任何疑問或者建議歡迎留言或者來信lujun.hust@gmail.com交流 在這裏咱們使用了bootstrapValidator,語法很簡單,就不解釋了。 結束語 免費學習更多精品課程,登陸樂搏學院官網http://h.learnbo.cn/ 或關注咱們的官方微博微信,還有更多驚喜哦~ 本文出自 「Jhuster的專欄」 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/1713220
相關文章
相關標籤/搜索