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团队!

    

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Android上集成ijkplayer,我们需要进行以下几个步骤: 1. 下载ijkplayer库:我们可以从Ijkplayer的GitHub页面下载最新版本的库文件。可以选择下载预编译版本,或者自行编译源代码。 2. 将库文件添加到项目中:将下载的ijkplayer库文件解压后,将其中的so文件(如libijkffmpeg.so)复制到项目的libs文件夹中。然后,在项目的build.gradle文件中添加如下配置: ``` dependencies { implementation fileTree(dir: 'libs', include: ['*.so']) } ``` 3. 在布局文件中添加播放器视图:在需要显示视屏的布局文件中,添加一个SurfaceView元素用于渲染视频图像。 4. 初始化播放器:在Activity或Fragment中,使用IjkMediaPlayer类初始化播放器。可以设置一些参数,例如设置视频的URL,设置是否开启硬解码等。 5. 添加播放控制功能:可以使用MediaController类实现一些基本的播放控制功能,例如播放、暂停、快进、快退等。将MediaController与IjkMediaPlayer进行关联,以实现控制操作。 6. 播放视频:调用IjkMediaPlayer的start()方法开始播放视频。 7. 添加播放器生命周期管理:在Activity或Fragment的生命周期方法中,分别调用IjkMediaPlayer的pause()、stop()和release()方法,以实现播放器的生命周期管理。 需要注意的是,在集成ijkplayer时,可能会遇到一些依赖冲突或编译错误的问题。可以根据具体的情况解决这些问题,例如通过调整依赖版本、修改编译参数等。 以上是Android集成ijkplayer的基本步骤,通过这些步骤,我们可以在Android应用中实现视频播放功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值