开源播放器ijkplayer(⼀):使⽤Ijkplayer播放直播视频1、ijkplayer 编码
IjkPlayer⽀持硬解码和软解码。软解码时不会旋转视频⾓度这时需要你通过onInfo的what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED去获取⾓度,⾃⼰旋转画⾯。或者开启硬解硬解码,不过硬解码容易造成⿊屏⽆声(硬件兼容问题),下⾯是设置硬解码相关的代码
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);
2、ijkplayer 倍速播放
⽬前ijkplayer最新版本⽀持倍速播放(版本号0.7.7.1)。在早期版本对倍速播放⽀持的不是很好,只有6.0及以上的⼿机才能进⾏倍速播放。但是⽬前虽然所有的机型都⽀持倍速,但是6.0以下的⼿机明显有声调变化,这样⽤户体验不是很好(针对变调的⽂章会在以后更新)。下⾯是最新的倍速设置代码:
⽼版本代码:
⽼版本代码只能设置速度,不能获取,所以基本上不能⽤(⽽且机型⽅⾯只⽀持6.0以上的机型)。
更新:当前最新版本为0.8.8,倍速功能能够在所有android机型上正常使⽤,倍速时可能也存在声调问题,但是可以通过设置参数来解决:ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
3、ijkplayer的⼀些重要的视频返回码
int MEDIA_INFO_VIDEO_RENDERING_START = 3;//视频准备渲染
int MEDIA_INFO_BUFFERING_START = 701;//开始缓冲
int MEDIA_INFO_BUFFERING_END = 702;//缓冲结束
int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//视频选择信息
int MEDIA_ERROR_SERVER_DIED = 100;//视频中断,⼀般是视频源异常或者不⽀持的视频类型。
int MEDIA_ERROR_IJK_PLAYER = -10000,//⼀般是视频源有问题或者数据格式不⽀持,⽐如⾳频不是AAC之类的
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//数据错误没有有效的回收
4、Ijkplayer调⽤seekTo存在的问题
ijkplyer 在播放部分视频时,调⽤seekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题(GOP导致的),视频压缩⽐较⾼,⽽seek只⽀持关键帧,出现这个情况就是原始的视频⽂件中i帧⽐较少,播放器会在拖动的位置最近的关键帧。所以,⽬前针对此问题ijkPlayer⽆解。
注:⽬前最新版0.8.8相对于之前的版本来说,seekTo的问题应该会⼩很多,但是不可避免的还是会存在。
相关代码:
setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
5. Ijkplayer⾳视频不同步问题
在开始使⽤过程当中对rtmp视频流进⾏播放,会出现严重的视频⾳频不同步现象,并且随着播放的时间越长,视频与⾳频的差距越⼤。具体原因是CPU在处理视频帧的时候处理得太慢,默认的⾳视频同步⽅案是视频同步到⾳频, 导致了⾳频播放过快,视频跟不上。
{ "framedrop", "drop frames when cpu is too slow",
OPTION_OFFSET(framedrop), OPTION_INT(0, -1, 120) },
framedrop 控制着允许丢帧的范围。可以通过修改 framedrop 的数值来解决不同步的问题,framedrop 是在视频帧处理不过来的时候丢弃⼀些帧达到同步的效果。具体设置:
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5);
framedrop 的具体⼤⼩根据实际情况⽽定, ⼀般丢太多帧也不好,会影响⽤户的观看体验。
6、如何⽀持https链接播放?
如果你的项⽬要进⾏加密播放HLS协议的视频,要想⽀持https,须要在普通编译的基础上,进⾏⼀些配置。
接下来我们来编译openssl
a). init openssl
$ cd .. 进⼊到ijkplayer的⽬下
$ ./init-android-openssl.sh 去远程仓库拉取openssl的远程代码,如果是iOS的,这⾥是init-ios-openssl.h
b). compile openssl
$ cd android/contrib
$ ./compile-openssl.sh clean
$ ./compile-openssl.sh all
经过以上步骤已经编译好openssl了,然后我们执⾏⼀下⽅法
$./compile-ffmpeg.sh clean
编译ffmpeg软解码库,这个过程会⽣成各种架构的ffmpeg 这个过程⽐较耗时
android最新版$./compile-ffmpeg.sh all
7、Ijkplayer使⽤⼩技巧
a. 下载速度可以通过IjkMediaPlayer的 getTcpSpeed获取。
b. ⾼分辨率开启硬解码,不⽀持的话会⾃动切换到软解,就算开启mediacodec,如果设备不⽀持,显⽰的解码器也是avcodec软解。
c. IjkMediaPlayer.setOption可配置的对应头⽂件参考:。
d. 设置cookie 可以通过ijkPlayer的public void setDataSource(String path, Map<String, String> headers) 的header实现设置,参考ijkPlayer的,headers也是在内部被转化为何issuses⼀样的setOption⽅法
8、基于ijkplayer的开源播放器推荐
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论