天天看點

android播放位址失效,[Android]使用MediaPlayer播放m3u8位址遇到的問題

已經失效了, 請自行解析m3u8檔案獲得真實視訊位址進行播放.

在這坑裡掉了幾天,終于爬出來了。

起因是youku的拼接位址方式失效了,經過抓包分析iOS版本的播放位址,發現其使用的m3u8位址為以下:

http://pl.youku.com/playlist/m3u8?vid={id}&type=mp4

http://pl.youku.com/playlist/m3u8?vid={id}&type=hd2

http://pl.youku.com/playlist/m3u8?vid={id}&type=flv

對應不同的清晰度。

發現位址以後iOS的播放就沒啥問題了,安卓這邊,位址填到原先的播放代碼裡面,在裝置上測試也通過。播放相關代碼大緻如下:

MediaPlayer mediaplayer = new MediaPlayer();

mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaplayer.setOnBufferingUpdateListener(this);

mediaplayer.setOnCompletionListener(this);

mediaplayer.setOnPreparedListener(this);

mediaplayer.setOnErrorListener(this);

mediaplayer.setOnVideoSizeChangedListener( this );

mediaplayer.setDataSource(url);

mediaplayer.prepare();

但是做相容性測試的時候發現有大約一半的裝置不能播放,症狀是在OnPreparedListener接口的OnPrepared的回調被調用時,無法獲得視訊的高寬以及長度資訊。

@Override

public void onPrepared(MediaPlayer mp) { // prepareAsync結束後調用

int videoWidth = mp.getVideoWidth();

int videoHeight = mp.getVideoHeight();

if (videoHeight != 0 && videoWidth != 0) {

play();//播放視訊

resizePlayWindow();// 重新計算播放視窗大小

mVideoListener.onPrepareEnd(videoWidth, videoHeight);

}

}

此處獲得的videoWidth 以及videoHeight均為0。

同樣,OnVideoSizeChangedListener接口的onVideoSizeChanged 回調傳回的高寬也都未0。

反編譯其他類似應用後,發現問題出在OnPrepared方法。正常工作的應用處理如下:

@Override

public void onPrepared(MediaPlayer mp) { // prepareAsync結束後調用

int videoWidth = mp.getVideoWidth();

int videoHeight = mp.getVideoHeight();

if (videoHeight != 0 && videoWidth != 0) {

play();//

resizePlayWindow();// 重新計算播放視窗大小

mVideoListener.onPrepareEnd(videoWidth, videoHeight);

} else {

mMediaPlayer.start();

}

}

即在無法獲得資訊的情況下仍然start MediaPlayer。這樣處理後會再次觸發OnVideoSizeChangedListener接口的onVideoSizeChanged接口,并且在這個回調時能正确的傳回視訊資訊。修改onVideoSizeChanged實作如下:

@Override

public void onVideoSizeChanged( MediaPlayer mediaPlayer, int width, int height ) {

//此時width與height包含正确的視訊高寬。

if(width > 0 && height > 0) {

play();//獲得視訊高寬後播放。

resizePlayWindow();// 重新計算播放視窗大小

// 初始化完成,更新ui

mVideoListener.onPrepareEnd(width, height);

}

}

修改後在所有裝置上均能正常播放m3u8視訊。

以上方式都過期了.

目前采取以下方式來獲得youku的播放位址:

背景開啟一個webview去載入youku的頁面

分析它的頁面代碼來獲得真實的播放源

m3u8檔案使用之前的方式也不能完美播放, 目前使用以下方式播放:

由于m3u8格式本身是一個視訊清單檔案, 對于非直播的視訊源, 可以下載下傳并解析此檔案來獲得其中的視訊位址,并使用MediaPlayer等控件進行播放.