閱讀119 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android 在線視頻播放總結

協議選擇

當前流媒體播放中常用到的協議有rtmp,rtsp和http等。各個協議適用於不同的場景。各有優點。具體的區別可參見:

播放器選擇

Android 平台上支持在線播放的播放器種類繁多。有google大廠提供的開源框架Exoplayer,也有係統本身提供的在線播放控件VideoView。兩種方式各有優點。大廠提供的開源框架對於使用場景中的可能會遇到特殊情況考慮比較豐富。係統本身的api使用簡單,短短幾行代碼就能實現在線視頻資源的播放。

係統播放器是如何實現在線播放

Android的VideoView是通過http協議實現邊下邊播的。設置VideoView遠程在線資源的http url,調用start操作ViewView就可以直接邊下載邊播放。
具體代碼參見如下:

VideoView mVv = (VideoView) findViewById(R.id.vv);
...
// 播放在線視頻
mVideoUri = Uri.parse("https://****/abc.mp4");
mVv.setVideoPath(mVideoUri.toString());
...
mVv.start();

調用start操作後,通過http get請求下載文件。得到文件的metedata之後,解析出該文件的編碼、幀率、時長等信息。然後邊下載邊送入軟/硬解碼器進行解碼,最後通過SurfaceView將解碼後的數據顯示出來,比較複雜,相當於自己做流媒體播放器了。
看似簡單的代碼。其實係統幫我們實現了下載,解析,解碼,播放等一係列操作。

遇到的坑

使用係統播放器簡單,方便。看起來一切都是很完美的。直到客戶發現一個問題。
用android 係統自帶的 videoview 播放存儲在oss的大視頻(播放時長超過3分鍾)。會提示java.net.ProtocolException: unexpected end of stream。但相同的視頻存儲在七牛雲上播放卻不會出現問題。

這個問題一開始很迷茫。絲毫沒有查找思路。經過反複抓包測試後,發現VideoView下載到一定緩存後就不下載了。
具體表現如下:
經過1分半後服務器已斷開和客戶端連接

這時候我們一個同事猜測是不是服務器主動斷開鏈接?
經過進一步大膽假設和驗證。發現VideoView的緩存是有上限的。並且到達緩存上限後不會主動向服務器請求獲取更多內容。此處輸入圖片的描述
如果視頻文件播放幀率較底,緩存的文件播放時間比較長。那麼這段時間內客戶端都不會向服務器請求更多的數據。服務端因為長時間沒收到客戶端請求,從而主動斷開和客戶端的連接。此處輸入圖片的描述

找到問題的原因就好^_^。在CDN服務器上更改服務器和客戶端連接超時時間。一切完美解決。

最後更新:2017-09-27 14:03:54

  上一篇:go  2017雲棲大會·杭州峰會:《雲數據·大計算:海量日誌數據分析與應用》之《數據分析展現:可視化報表及嵌入應用》篇
  下一篇:go  幣幣交易係統網站搭建,幣幣交易係統開發