侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

ijkplayer 播放器的快速使用,和播放源更换

Z同学
2022-03-22 / 0 评论 / 2 点赞 / 323 阅读 / 2,150 字
温馨提示:
本文最后更新于 2022-03-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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返回的数据等等。视频源来源多种多样。

我们可以创建一个播放接口,接收外界传的播放器链接。

public void playerVideo(String mVideoUrl) {
        try {
            ijkMediaPlayer.setDataSource(mVideoUrl);
            ijkMediaPlayer.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

但是我们如果直接使用这个播放器,播放第二个视频链接的时候,按照上面的写法就会出现错误了。

如果播放器正在播放,然后调用setDataSourceprepareAsync就会崩溃了。我们需要先进行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队列的方法,存储和释放,可以有效提高播放器的响应速度

2

评论区