1.介绍
主要介绍ijkplayer sdk集成之后,我们如何进行播放rtsp或https链接的视频。
同时如果播放器的源发生变化后,如何修改不崩溃。
关于ijkplayer的相关问题可以通过ijkplayer (zinyan.com) 了解。里面汇总了本站关于ijkplayer的相关文章。
2. 使用
我们在初始化ijkplayer的播放器时通常都是使用IjkMediaPlayer
对象。下面就来介绍如何初始化并播放视频。
(PS:关于sdk的集成等功能,可以通过本站相关文章介绍进行了解。这里主要讲sdk集成之后如何配置播放器)
2.1 IjkMediaPlayer 初始化
我们首先需要创建一个IjkMediaPlayer
对象并进行初始化。
private IjkMediaPlayer ijkMediaPlayer;
ijkMediaPlayer = new IjkMediaPlayer();
ijkMediaPlayer.setSurface(this.surface); //surface窗口,我们可以使用 TextureView 将它的Surface传给
// 播放器在准备完成,可以开播时会发出onPrepared回调
ijkMediaPlayer.setOnPreparedListener(onPreparedListener); //监听播放器准备就绪的回调
ijkMediaPlayer.setOnInfoListener(onInfoListener); // 监听播放器各种状态 例如缓冲,渲染中,缓冲结束等等
ijkMediaPlayer.setOnErrorListener(onErrorListener); // 播放器各种错误状态监听,例如协议不支持,视频源非法等等
ijkMediaPlayer.setKeepInBackground(true); //保持屏幕持续点亮 --避免息屏
//处理缓冲,提高播放速度
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1); //dns 清理
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1);
上面这些配置,可以在初始化的时候就配置完毕。
2.2 提供播放源进行播放
我们的视频源可能是本地,可能是远程api返回的数据等等。视频源来源多种多样。
我们可以创建一个播放接口,接收外界传的播放器链接。
代码语言:javascript复制public void playerVideo(String mVideoUrl) {
try {
ijkMediaPlayer.setDataSource(mVideoUrl);
ijkMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
但是我们如果直接使用这个播放器,播放第二个视频链接的时候,按照上面的写法就会出现错误了。
如果播放器正在播放,然后调用setDataSource
和prepareAsync
就会崩溃了。我们需要先进行reset
操作,才能再次给ijkMediaPlayer
传递DataSource
。
public void reload(String url) {
ijkMediaPlayer.reset();
ijkMediaPlayer.setSurface(this.surface);
try {
ijkMediaPlayer.setDataSource(url);
ijkMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
至于怎么判断这两个方法的调用。可以根据ijkMediaPlayer
的播放源是否有值来判断。
String dataSource = ijkMediaPlayer.getDataSource();
if (dataSource == null) {
//执行
playerVideo(mVideoUrl)
}else{
reload(mVideoUrl)
}
2.3 reset时间过长问题
一般切换频率不高的情况,能够容忍一定缓冲时间的话。那么到上面就可以了。
但是如果像列表一样,每个视频源切换时需要播放器实时响应。那么reset方法就需要放到线程中去处理了。
因为reset是一个耗时操作。
可以参考IjkMediaPlayer.reset()耗时的一个解决方案_CL_slacking的博客-CSDN博客_mediaplayer reset 这篇文章的方法,采用Queue队列的方法,存储和释放,可以有效提高播放器的响应速度