從jjkPlayer的github地址把官方的項目down下來。本文參考的版本是0.8.4。
copy “..\ijkplayer-master\android\ijkplayer\ijkplayer-example\src\main\java\tv\danmaku\ijk\media\example\widget\media”這個media文件夾到自己的項目里。
在builder.gradle里面添加如下的代碼:
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
如果需要其他的abi在導入其他的庫,一般armv7a就足夠了。
關鍵是參考IjkVideoView這個類里面的代碼。
官方的IjkVideoView是支持列表視頻的,本次集成只播放單個視頻。所以重新創(chuàng)建一個類去實現(xiàn),大概的思路跟IjkVideoView一樣,本文就命名為IVideoView。
不需要Settings相關的代碼,后面涉及到Settings的代碼,都去掉。
基本步驟如下:
- initBackground方法不需要,不需要后臺播放;
- initRenders方法是切換渲染的控件,直接采用SurfaceView,去掉這個方法直接使用其調(diào)用的setRender方法;
- 在setRender調(diào)用了setRenderView的方法,我們將setRenderView里面的代碼直接放到setRender方法里,去掉setRenderView方法;
- 去掉initVideoView中創(chuàng)建標題的代碼,那么initVideoView這個方法就改造完了;
- copy設置URI的方法,不需要設置列表的方法;
- copy openVideo的方法;
- openVideo里面有個createVideo的方法,這個方法里面我們需要整理一番,里面Settings的方法比較多;
把openVideo里面調(diào)用createVideo方法后面的代碼也移到createVideo方法里面,改完的代碼如下:
/**
* 初始化播放器
*/
private void createPlayer() {
try {
mMediaPlayer = new IjkMediaPlayer();
//設置日志類型
mMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_ERROR);
//設置為軟解碼 ijk是基于FFmpeg的,采用軟解,此處待定
mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
//opensles:嵌入式音頻加速標準 設置為默認支持
mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 1);
//域名檢測
mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);
mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
// mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "analyzeduration", "2000000");
// mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "probsize", "4096");
mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
//設置視頻初始化的監(jiān)聽
/**
* @see #setOnPreparedListener(IMediaPlayer.OnPreparedListener)
*/
mMediaPlayer.setOnPreparedListener(mPreparedListener);
/**
* @see #setOnCompletionListener(IMediaPlayer.OnCompletionListener)
*/
mMediaPlayer.setOnCompletionListener(mCompletionListener);
/**
* @see #setOnErrorListener(IMediaPlayer.OnErrorListener)
*/
mMediaPlayer.setOnErrorListener(mErrorListener);
/**
* @see #setOnInfoListener(IMediaPlayer.OnInfoListener)
*/
mMediaPlayer.setOnInfoListener(mInfoListener);
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
//當前加載的視頻流百分比
mCurrentBufferPercentage = 0;
//版本在4.0以上和4.0以下設置方式
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mMediaPlayer.setDataSource(mAppContext, mUri, null);
} else {
mMediaPlayer.setDataSource(mUri.toString());
}
bindSurfaceHolder(mMediaPlayer, mSurfaceHolder);
//設置流的類型
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//屏幕常亮
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.setLooping(loop);
mMediaPlayer.prepareAsync();
mCurrentState = STATE_PREPARING;
attachMediaController();
} catch (IOException e) {
// Log.w(TAG, "Unable to open content: " + mUri, e);
mCurrentState = STATE_ERROR;
mTargetState = STATE_ERROR;
mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
// e.printStackTrace();
} finally {
}
}
- 各種監(jiān)聽事件直接copy一波,監(jiān)聽事件里面需要調(diào)用的方法copy一波;
- realse方法直接copy;
- 各種狀態(tài)轉(zhuǎn)換方法里面的內(nèi)容直接copy;
- 刪除不必要的類,最終media包里面的類如下:

簡化代碼后的media包
到這里輪子就基本創(chuàng)建好了。
接著就是寫符合自己需求的控制器代碼了。
ijkPlayer集成筆記(二)