ijkplayer集成踩坑记录
本人公司做的项目有这么一个功能,倍速播放音视频。我在进到公司之前使用的是VLC开源项目,网上找的代码。开始能用,但是后来应用市场要求提高targetSdkVersion,但是提高了这个后,原来的项目启动就会闪退,报这样的一个错误libxxx.so- text relocations,跟这位兄弟描述的一样https://blog.csdn.net/ahence/article/det...
本人公司做的项目有这么一个功能,倍速播放音视频。我在进到公司之前使用的是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团队!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)