开源播放器 ijkplayer (一) :使用Ijkplayer播放直播视频

一、ijkplayer 编码

IjkPlayer支持硬解码和软解码。 软解码时不会旋转视频角度这时须要你经过onInfowhat == 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 倍速播放

目前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

三、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;//数据错误没有有效的回收

四、Ijkplayer调用seekTo存在的问题

ijkplyer 在播放部分视频时,调用seekTo的时候,会跳回到拖动前的位置,这是由于视频的关键帧的问题(GOP致使的),视频压缩比较高,而seek只支持关键帧,出现这个状况就是原始的视频文件中i帧比较少,播放器会在拖动的位置找最近的关键帧。因此,目前针对此问题ijkPlayer无解。架构

注:目前最新版0.8.8相对于以前的版原本说,seekTo的问题应该会小不少,可是不可避免的仍是会存在。ide

相关代码:ui

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 的具体大小根据实际状况而定, 通常丢太多帧也很差,会影响用户的观看体验。

六、如何支持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 这个过程比较耗时
$./compile-ffmpeg.sh all

七、Ijkplayer使用小技巧

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方法

八、 基于ijkplayer的开源播放器推荐

GSYVideoPlayer

相关文章
相关标签/搜索