首页 > 代码库 > 直播技术总结(二)ijkplayer的编译到Android平台并测试解码库

直播技术总结(二)ijkplayer的编译到Android平台并测试解码库

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/55670380

前言:ijkplayer,是b站工程师开源的播放器框架,基于FFmpeg及MediaCodec,内部实现软解及硬解的功能,对于没有自研底层播放器的公司,用它确实是比较合适了。关于介绍可以直接看:https://github.com/Bilibili/ijkplayer,今天主要是对ijkplayer进行编译在Android平台上运行。

首先看下效果图:
gif图如下:


技术分享

编译过程:在mac上进行编译这个库
先clone一份源码到本地:

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.7.7.1 #最新分支

技术分享

技术分享

编译ffmpeg

./init-android.sh  # 初始化ijkplayer中和android相关,如果是在iOS,这是就是./init-ios.sh

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all #编译ffmpeg

技术分享

囧,发现pro上没有配置ndk环境。

技术分享

下载ndk,还好在《手把手图文并茂教你用Android Studio编译FFmpeg库并移植》中,我把ndk-10e存到云盘中。

  • 供参考下载地址见本文最下面,也可自行下载。
  • 用命令 ./android-ndk-r10e-mac-x86_64.bin,就可进行进行解压,如下图:

技术分享

不过并没有这么顺利, 在解压过程中出现Permission denied。
这时要改下权限,执行命令 chmod a+x ./android-ndk-r10e-mac-x86_64.bin

技术分享

配置ndk环境

  • 启动终端Terminal
  • 进入当前用户的home目录
    • 输入cd ~ 或 /Users/YourUserName
  • 创建.bash_profile
  • 输入touch .bash_profile
  • 编辑.bash_profile文件

  • 输入open -e .bash_profile
    因为是为了配置NDK开发环境,输入Android NDK下目录,前面是android sdk的,可以不用动它,最终.bash_profile文件如下:

技术分享

  • 保存文件,关闭.bash_profile
  • 更新刚配置的环境变量
    • 输入source .bash_profile,让刚长配置生效

ndk-build测试

  • 找到ndk-10e中sample目录,cd hello-jni中,执扫命令ndk-build。就会出现如下所示:

技术分享

重新回到编译ffmpeg的过程:
依旧执行:./compile-ffmpeg.sh all,得到如下所示
技术分享
本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/55670380

编译结束时如下:

技术分享

最终,在crontrib目录下,会出现编译so所需要的各平台文件,如arm,x86。也可以指定平台,编译。

技术分享

最后执行如下命令,让ijkplayer和ffmpeg打成so库及demo工程:

cd ..
./compile-ijk.sh all

技术分享

执行完毕后,就会出现一个ijkplayer文件夹,为studio工程,里面包含各平台so库。导入android studio,就可以运行demo工程。

技术分享

导入Android Studio,example工程运行到模拟器上:

技术分享

点击Sample,进入播放测试

技术分享

最后我们编译它,不是用来看看demo就完了的。我们可以改c代码,并且按如上方式重新编译成so库,如果要在其他工程中使用的话。xml中引用如下:

<tv.danmaku.ijk.media.example.widget.media.IjkVideoView
            android:id="@+id/video_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"/>

在你的Java代码中加入如下一些初始化条件就可以啦。

 videoView = (IjkVideoView) findViewById(R.id.videoview);
        // init player
IjkMediaPlayer.loadLibrariesOnce(null);
        IjkMediaPlayer.native_profileBegin("libijkplayer.so");
videoView.setVideoURI(Uri.parse(mUrl));

videoView.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {
      @Override
      public void onPrepared(IMediaPlayer mp) {
           videoView.start();
      }
});

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

技术分享
如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    直播技术总结(二)ijkplayer的编译到Android平台并测试解码库