ijkplayer集成踩坑记录

        本人公司做的项目有这么一个功能,倍速播放音视频。我在进到公司之前使用的是VLC开源项目,网上找的代码。开始能用,但是后来应用市场要求提高targetSdkVersion,但是提高了这个后,原来的项目启动就会闪退,报这样的一个错误libxxx.so- text relocations,跟这位兄弟描述的一样https://blog.csdn.net/ahence/article/details/68953878,.so包里包的错,我们又没有源码,没办法,只好换一个音视频播放文案了。

      音视频播放文案里面能够实现倍速播放的目前我查到的有几下几种:

     1.系统自带的MeidaPlayer(android6.0以后才能支持,并且支持的单视频格式很少)

     2.vitamio

     3.ijkplayer

     4.vlc

     5.exoplayer 民间倍速版本

   关于这几种文案的优缺点我就不一 一探讨了,可以参考这位仁兄的https://www.jianshu.com/p/89528b8e404d。

最终我选择了国产的开源项目ijkplayer

ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器。FFmpeg的是全球领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤器和播放大部分的视频格式。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

     我现在的重点是向大家陈述一下我使用ijkplayer遇到的问题和最终我是怎么解决的,最后,最重要的是给大家提供一个好用的.so包。

 第一坑:我使用网上说的最方便的方式导入ijkplayer

allprojects {
    repositories {
        jcenter()
    }
}
dependencies {
    # required, enough for most devices.
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' 
    compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'

    # Other ABIs: optional
    compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'

    # ExoPlayer as IMediaPlayer: optional, experimental
    compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8' 
}

这样集成后如果播放https地址的视频,直接报错播放不出来。网上说就因为ijkplayer默认就是不支持https协议的直播源的播放,如果要支持https传输协议,必须加载openssl依赖库。网上都说要自己编译,好吧编译要准备环境,还要花好长时间,工作项目工期挺紧的不想搞啊,于是在网上找了好几个地方,终于找到一个编译好的,可以播放https的.so包了。

第二坑:有的mp4文件只有声音没有图像。经过一番调查发现原来mp4文件还分不同的编码格式。用专门的软件(QQ影音可以)打开mp4文件,查看属性发现有的视频编码格式是h264,有的编码格式是mpeg4, h264格式的可以播放 mpeg4格式的不能播放。跟这位仁兄描述的一样https://blog.csdn.net/qq_35624842/article/details/82683667。是因为默认编译的ijkplayer没有配置成支持所有的音视频格式,mpeg4格式的mp4文件就不支持https://github.com/bilibili/ijkplayer/issues/2541。网上七找八找,找了好久都没有同时能解决我以上两点问题的已经编译好的so包,没办法只好自己编译了。编译方法步骤也不难,我就是按照网上说的方法解决的。参考:https://blog.csdn.net/qq_35624842/article/details/82683667 ,https://www.jianshu.com/p/cb7868a09756。 

  终于编译好了,使用新的so包可以解决了https支持的问题和mp4无图像的问题。高兴!

可是高兴没多久,被测试的发现了迎来了第三坑。

第三坑:在切换到1.5倍速播放音视频的时候发现在某些手机上音频变调了,从正常的声音变成了一个搞笑的童音的那种。网上找了一些解决文案,试了发现还是不起作用。最后发现在prepare之前,使用setOption为1才能不变调。具体配置如下:

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);

 

另外还有一点很重要的,这个配置放在哪个地方也决定了能否起作用,关于这一点我踩了好多坑:

第一次:放在mediaPlayer.setSpeed前面是不行的,

第二次:直接在new IjkMediaPlayer 后面也是不行的

第三次,按照github上一位大哥说的,要放在prepare之前。https://github.com/bilibili/ijkplayer/issues/3569

我的代码里 面只有 mMediaPlayer.prepareAsync()这个,于是我就在prepareAsync之前了, 代码位置如下:

    /**
     * 添加file文件到MediaPlayer对象并且准备播放音频
     */
    private void prepareMusic(String musicUrl) {
        //获取文件路径
        try {
            mMediaPlayer.stop();
            mMediaPlayer.reset();
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            //此处的两个方法需要捕获IO异常
            //设置音频文件到MediaPlayer对象中
            mMediaPlayer.setDataSource(musicUrl);
            mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
            mMediaPlayer.prepareAsync();
        } catch (IOException e) {
            Log.d(TAG, "设置资源,准备阶段出错");
            e.printStackTrace();
        }
    }

这样设置之后,终于最后不变调了。大功告成!最后我把编译好的支持https和mp4两种编码格式的so包提供给大家下载。由于目前绝大多数的android手机的cpu架构就是给予arm7的,所以我只编译了arm7的so包。下载地址:https://download.csdn.net/download/nnmmbb/11461980

 

虽然经历了这些曲折,我还是不后悔使用ijkplayer。因为相比起vlc遇到的问题网上根本找不到解决方案,一筹莫展,ijkplayer遇到的问题网上能找到很多资资料,毕竟最后都能解决。最后感谢ijkplayer团队!

    

你可能感兴趣的:(音视频,ijkplayer)