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是支持列表视频的,本次集成只播放单个视频。所以重新创建一个类去实现,大概的思路跟IjkVideoView一样,本文就命名为IVideoView。

不需要Settings相关的代码,后面涉及到Settings的代码,都去掉。

基本步骤如下:

  1. initBackground方法不需要,不需要后台播放;
  2. initRenders方法是切换渲染的控件,直接采用SurfaceView,去掉这个方法直接使用其调用的setRender方法;
  3. 在setRender调用了setRenderView的方法,我们将setRenderView里面的代码直接放到setRender方法里,去掉setRenderView方法;
  4. 去掉initVideoView中创建标题的代码,那么initVideoView这个方法就改造完了;
  5. copy设置URI的方法,不需要设置列表的方法;
  6. copy openVideo的方法;
  7. openVideo里面有个createVideo的方法,这个方法里面我们需要整理一番,里面Settings的方法比较多;
    把openVideo里面调用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);

            //设置视频初始化的监听
            /**
             * @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. 各种监听事件直接copy一波,监听事件里面需要调用的方法copy一波;
  2. realse方法直接copy;
  3. 各种状态转换方法里面的内容直接copy;
  4. 删除不必要的类,最终media包里面的类如下:
简化代码后的media包

到这里轮子就基本创建好了。

接着就是写符合自己需求的控制器代码了。
ijkPlayer集成笔记(二)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 1 背景 公司的底层播放器实际上是ffplayer作为基础修改的,当然需要好好学习研究。 记录下来,作为以后备忘。...
    nothingwxq阅读 4,351评论 4 5
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,374评论 0 3
  • 本文记录的是ijkplayer的初始化流程(重点在分析底层c代码的逻辑),为了更好的理解这部分内容,建议大家下载i...
    ce0b74704937阅读 3,070评论 0 1
  • 随着互联网技术的飞速发展,移动端播放视频的需求如日中天,由此也催生了一批开源/闭源的播放器,但是无论这个播放器功能...
    金山视频云阅读 46,282评论 28 170
  • 上面这个工作属于财务工作的基本功之一,以前都是我交别人做。从东北回来之后一直一个人抓弄工作,没找个学徒也没...
    栗花香阅读 577评论 18 15