美文网首页Android音视频系列
ijkplayer 开源项目分析(一)编译

ijkplayer 开源项目分析(一)编译

作者: 码上就说 | 来源:发表于2020-02-07 16:58 被阅读0次

    ijkplayer 开源项目分析(一)编译
    ijkplayer 开源项目分析(二)播放流程概要
    ijkplayer 开源项目分析(三)msg_queue消息机制剖析
    ijkplayer 开源项目分析(四)解决video size识别问题
    ijkplayer 开源项目分析(五)ffmpeg升级到4.X版本
    ijkplayer 开源项目分析(六)视频解析核心流程
    ijkplayer 开源项目分析(七)ijkplayer自动旋转功能
    ijkplayer 开源项目分析(八)avformat_open_input剖析
    ijkplayer 开源项目分析(九)核心option解析
    ijkplayer 开源项目分析(十)提升直播画面质量
    ijkplayer 开源项目分析(十一)filter过滤器介绍
    ijkplayer 开源项目分析(十二)filter改变声音音量

    ijkplayer是 BiliBili 维护的一个开源的 流媒体播放器,有android和iOS跨平台的特性;适合播放网络流媒体或者直播场景,播放效果和性能均非常棒,是一个优秀的播放器开源库;
    Github地址:https://github.com/bilibili/ijkplayer

    目前BiliBili 基本上不再维护这个开源库了,这也是ijkplayer 目前的一个劣势,不过目前而言,ijkplayer的性能还是比较能打的,我们研究它的架构,主要是想探究一下ijkplayer是如何实现播放功能的,一边从中汲取一些有益的东西,辅助我们后续的开发;

    1.源码目录介绍


    这个工程的主目录,其中几个重点的目录已经标注;

    • config 目录:config 目录下有几个module 配置,这是ffmpeg的编译参数;
    • android 目录:android 目录下是 ijkplayer android 平台下的工程文件;
    • extra 目录:extra 目录下是 ijkplayer使用的开源库的位置,例如= ffmpeg,openssl,libyuv,soundtouch等等;
    • ijkmedia 目录:ijkmedia 目录是非常重要的,是ijkplayer的native层的代码,播放模块的核心逻辑都在这个目录中;
    • ijkprof 目录:ijkprof 目录是 ijkplayer的 性能调试库,需要dump ijkplayer的profile文件的时候需要带上这个库;
    • ios 目录:ios 目录是 ijkplayer iOS平台下的工程文件;
    • tools 目录:镜像文件拉取脚本的目录;

    除了上面的目录,还有一些配置脚本:

    • init-android.sh:执行 拉取 ffmpeg 库操作;针对不同的CPU平台拉取ffmpeg 库;
    • init-android-openssl.sh:拉取 openssl库操作;
    • init-android-soundtouch.sh:拉取soundtouch库操作;
    • init-android-libyuv.sh:拉取libyuv库操作;

    1.1 android目录


    其中有几个重要的目录或者文件;

    • contrib 目录:存放下载好的ffmpeg 库 和 openssl库;针对不同的CPU架构;
      还有编译 ffmpeg 和 openssl的脚本;
    • ijkplayer 目录:存放 编译好的ijkplayer 相关的so 以及 java层的ijkplayer 框架库;
    • compile-ijk.sh:编译ijk so的脚本;

    注意:要先编译openssl,生成 .a 库,然后再编译 ffmpeg (加上openssl 参数),这样生成的ffmpeg库就包括了openssl库了;

    1.2 ijkmedia 目录

    • ijkj4a:这是 native层和 java层回调的接口层;播放器有很多状态回调,是需要从底层回调上去的,ijkj4a层就完成这样的工作;
    • ijkplayer:这是 ijk native的接口层和底层 sdl交互的层;主要是native代码;
    • ijksdl:SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,这儿是sdl的处理库;
    • ijksoundtouch:SoundTouch是一个开源的音频处理库,主要实现包含变速、变调、变速同时变调等三个 功能模块,能够对媒体流实时操作,也能对音频文件操作
    • ijkyuv:这是libyuv的库代码;(libyuv是Google开源的yuv图像处理库,实现对各种yuv数据之间的转换,包括数据转换,裁剪,缩放)

    2.编译

    需要配置ANDROID_SDK、ANDROID_NDK 到PATH中;
    我选择的NDK版本是android-ndk-r18b
    目前ijkplayer 最新的稳定分支是 k0.8.8分支,这个分支上次更新的时间是:2018-2-6 ,很久没有更新了,即使这样,这也是最新的稳定分支,建议还是切换到这个分支来编译;

    • 执行 ./init-android.sh
      会下载ffmpeg 库;
    • 执行 ./init-android-openssl.sh
      会下载openssl 库;
    • 进入 android/contrib 目录;
      执行 ./compile-openssl.sh all
      执行 ./compile-ffmpeg.sh all
    • 回调上一级目录,cd ..
      执行 ./compile-ijk.sh all 会生成对应的so

    3.应用

    编译好了,我们要学会如何使用它;

    进入工程的 android/ijkplayer 目录下:



    可以看到ijkplayer-java 工程,ijkplayer java层的api都在这个工程中,我们可以引用这个库,也可以自己建一个Android Library 将 工程中代码拷贝过来;

    编译生成的so在 ijkplayer-arm64 ijkplayer-armv7a ijkplayer-armv5 ijkplayer-x86_64 ijkplayer-x86 中的 libs 中;只需要将相应的CPU 指令集的so拷贝过来使用就行;共有3个so;

    • libijkffmpeg.so:播放解码底层的库,主要是ffmpeg底层的那一套逻辑;demuxer,decode逻辑;
    • libijkplayer.so:player接口层;
    • libijksdl.so:sdl层,主要是播放渲染和音频渲染;

    这个工程中接入了 ijkplayer exoplayer mediaplayer ,可以实现三种播放器之间的切换,大家可以使用下看看:https://github.com/JeffMony/MediaLocalProxyLib

    相关文章

      网友评论

        本文标题:ijkplayer 开源项目分析(一)编译

        本文链接:https://www.haomeiwen.com/subject/ebnmxhtx.html