前言
原先编译完毕后的ijkplayer
已经满足播放需求了(ijkPlayer k0.8.8版本默认不支持https协议,编译支持https的libijkffmpeg.so 库 (zinyan.com)),但是之后视频源又提供了个rtsp
作为备选链接。
让其他链接失效的时候,切换到rtsp
上进行播放。然后我发现自己编译的库没有rtsp协议,播放的时候提示Protocol not found
。E/tv.danmaku.ijk.media.player.IjkMediaPlayer: Error (-10000,0)
所以打算先给开启一下rtsp协议。
从网上查询到的,配置很多还要改代码。也太复杂了。所以打算先简单开启一下协议,看看能不能支持播放的需求。
1. 修改module.sh 文件支持rtp和rtsp
访问:ijkplayer/config/module.sh
文件,添加下面两个配置
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp" //这个需要我们自己输入
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp" //这个只需要我们将disable 改为enable
然后执行编译
~/ijkplayer/android/contrib$ ./compile-ffmpeg.sh clean //清理原有的
~/ijkplayer/android/contrib$ ./compile-ffmpeg.sh all //编译最新的
编译输出的日志中可以看到
也就是我们的两个配置生效了。
然后再编译./compile-ijk.sh all
得到编译后的so文件。
2. 验证rtsp播放
我们将编译后的so文件拷贝到项目中直接使用。从网络上找到一个rtsp可播放的链接
rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov
验证效果是能够进行播放
也就是说,我们配置的ffmpeg
支持协议是正确的。
但是播放速度受影响:播放速度貌似有点卡顿。而且有时候会出现:Please fix your application to end transactions in progress properly and to
错误,然后界面停止播放。
有方案说要执行丢帧处理,才会播放速度提高。ijkplayer丢帧的处理方案 - 简书 (jianshu.com)。但是改动较大,同时由于对于底层代码的不熟悉,暂时没有敢动手。
我的最终解决方法是添加下面两个配置:
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0); //关键是这个
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer"); //关键是这个
可以达到流畅的rtsp播放了。
总结
本篇最后编译的so文件并没有其他小伙伴编译的库那么大。也不知道为什么它们有些人会编译的特别大。
本次编译尝试结果:
1.开放rtp
和rtsp
。
2.初始化ijkMediaPlayer
的时候,添加buffer
配置项。
3.实现rtsp播放。
如果想要我编译好的so库,可以关注公众号留言:ijkplayer
获取哦。
可以通过ijkplayer (zinyan.com) 看到更多关于ijkplayer 的内容。
- 最近添加了一个未使用编译器堆栈保护技术bug解决的so版本,可以通过文章:https://zinyan.com/?p=261 了解哦。
评论区