IjkPlayer支持硬解码和软解码。 软解码时不会旋转视频角度这时须要你经过onInfo
的what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED
去获取角度,本身旋转画面。或者开启硬解硬解码,不过硬解码容易形成黑屏无声(硬件兼容问题),下面是设置硬解码相关的代码html
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);
目前ijkplayer最新版本支持倍速播放(版本号0.7.7.1)。在早期版本对倍速播放支持的不是很好,只有6.0及以上的手机才能进行倍速播放。可是目前虽然全部的机型都支持倍速,可是6.0如下的手机明显有声调变化,这样用户体验不是很好(针对变调的文章会在之后更新)。下面是最新的倍速设置代码:android
public void setSpeed(float speed) { _setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed); }
老版本代码:ios
@TargetApi(Build.VERSION_CODES.M) public void setSpeed(float speed) { _setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed); }
老版本代码只能设置速度,不能获取,因此基本上不能用(并且机型方面只支持6.0以上的机型)。git
更新:当前最新版本为0.8.8,倍速功能可以在全部android机型上正常使用,倍速时可能也存在声调问题,可是能够经过设置参数来解决:github
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
此问题,本人也专门写了一篇文章作了详细的说明,文章地址为:http://www.javashuo.com/article/p-byumtufv-eb.htmlcookie
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;//数据错误没有有效的回收
ijkplyer 在播放部分视频时,调用seekTo的时候,会跳回到拖动前的位置,这是由于视频的关键帧的问题(GOP致使的),视频压缩比较高,而seek只支持关键帧,出现这个状况就是原始的视频文件中i帧比较少,播放器会在拖动的位置找最近的关键帧。因此,目前针对此问题ijkPlayer无解。架构
注:目前最新版0.8.8相对于以前的版原本说,seekTo的问题应该会小不少,可是不可避免的仍是会存在。ide
相关代码:ui
setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
在开始使用过程中对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 的具体大小根据实际状况而定, 通常丢太多帧也很差,会影响用户的观看体验。
若是你的项目要进行加密播放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 这个过程比较耗时 $./compile-ffmpeg.sh all
a. 下载速度能够经过IjkMediaPlayer的 getTcpSpeed
获取。
b. 高分辨率开启硬解码,不支持的话会自动切换到软解,就算开启mediacodec,若是设备不支持,显示的解码器也是avcodec软解。
c. IjkMediaPlayer.setOption可配置的对应头文件参考:ff_ffplay_options。
d. 设置cookie 能够经过ijkPlayer的public void setDataSource(String path, Map<String, String> headers) 的header实现设置,参考ijkPlayer的issues-1150,headers也是在内部被转化为什么issuses同样的setOption方法