ijkPlayer集成筆記(一)

從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的代碼,都去掉。

基本步驟如下:

  1. initBackground方法不需要,不需要后臺播放;
  2. initRenders方法是切換渲染的控件,直接采用SurfaceView,去掉這個方法直接使用其調(diào)用的setRender方法;
  3. 在setRender調(diào)用了setRenderView的方法,我們將setRenderView里面的代碼直接放到setRender方法里,去掉setRenderView方法;
  4. 去掉initVideoView中創(chuàng)建標題的代碼,那么initVideoView這個方法就改造完了;
  5. copy設置URI的方法,不需要設置列表的方法;
  6. copy openVideo的方法;
  7. 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 {

        }
    }
  1. 各種監(jiān)聽事件直接copy一波,監(jiān)聽事件里面需要調(diào)用的方法copy一波;
  2. realse方法直接copy;
  3. 各種狀態(tài)轉(zhuǎn)換方法里面的內(nèi)容直接copy;
  4. 刪除不必要的類,最終media包里面的類如下:
簡化代碼后的media包

到這里輪子就基本創(chuàng)建好了。

接著就是寫符合自己需求的控制器代碼了。
ijkPlayer集成筆記(二)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1 背景 公司的底層播放器實際上是ffplayer作為基礎修改的,當然需要好好學習研究。 記錄下來,作為以后備忘。...
    nothingwxq閱讀 4,514評論 4 5
  • 1.OC里用到集合類是什么? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,476評論 0 3
  • 本文記錄的是ijkplayer的初始化流程(重點在分析底層c代碼的邏輯),為了更好的理解這部分內(nèi)容,建議大家下載i...
    ce0b74704937閱讀 3,203評論 0 1
  • 隨著互聯(lián)網(wǎng)技術的飛速發(fā)展,移動端播放視頻的需求如日中天,由此也催生了一批開源/閉源的播放器,但是無論這個播放器功能...
    金山視頻云閱讀 46,942評論 28 170
  • 上面這個工作屬于財務工作的基本功之一,以前都是我交別人做。從東北回來之后一直一個人抓弄工作,沒找個學徒也沒...
    栗花香閱讀 630評論 18 15

友情鏈接更多精彩內(nèi)容