已經失效了, 請自行解析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等控件進行播放.