开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化

  • 前言
  • 一、GSYVideoPlayer是什么?
  • 二、简单使用
    • 1.First、在project下的build.gradle添加
    • 2.按需导入
    • 3. 常用代码
  • rtsp流的优化
    • 大功告成
  • 总结


开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化_第1张图片

前言

本文介绍,开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化


一、GSYVideoPlayer是什么?

github地址: https://github.com/CarGuo/GSYVideoPlayer

让我们看看介绍:
视频播放器(IJKplayer、ExoPlayer、MediaPlayer),HTTPS支持,支持弹幕,支持滤镜、水印、gif截图,片头广告、中间广告,多个同时播放,支持基本的拖动,声音、亮度调节,支持边播边缓存,支持视频本身自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,直接添加控件为封面,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,其他一些小动画效果,rtsp、concat、mpeg。(总结,高端大气上档次)
让我们看看作者:
在这里插入图片描述
让我们看看文档:
在这里插入图片描述

优点

  • 支持好几种开源播放器,集大成者
  • 可以按需引用所需要的依赖,这样一来包体积不会太大
  • 作者维护很勤快,有什么问题issues,作者也会帮忙看看
  • 文档写的很清楚不需要额外查资料,实在不懂代码拉下来一跑,对照着代码基本上就能理解了

缺点:

-有一些版本对应会有不同的问题,比如我使用的时候用了最新的依赖,按照文档不能播放rtsp流,降低了依赖过后就可以播放了。

如果想使用其他播放器的可以看看我的这篇文章

安卓的播放器对比与选型(vlc,EXOplayer,Ijkplayer,GSYVideoPlayer)详细过程

二、简单使用

其实按照文档来的话基础使用是完全没问题的,我们这边再来复习一下(文档真的算比较详细的有没有同感啊家人们)

1.First、在project下的build.gradle添加

代码如下(示例):

allprojects {
    repositories {
		...
        maven { url 'https://jitpack.io' }
        maven { url "https://maven.aliyun.com/repository/public" }
    }
}

2.按需导入

为了控制apk包的大小,我这边选择按需导入,我这里需要播放rtsp流,和回放,所以我导入了这三个依赖

我使用的versionCatalog

代码如下(示例):
toml文件如下(部分):

[versions]
gsyVideoPlayerVersion = "7.1.4"

[libraries]
gsyvideoplayer-java = {group = "com.shuyu", name = "gsyVideoPlayer-java",  version.ref= "gsyVideoPlayerVersion"}
gsyvideoplayer-exo2 = {group = "com.shuyu", name = "GSYVideoPlayer-exo2",  version.ref= "gsyVideoPlayerVersion"}
gsyvideoplayer-ex-so = {group = "com.shuyu", name = "gsyVideoPlayer-ex_so",  version.ref= "gsyVideoPlayerVersion"}

[bundles]
gsyvideoplayer = ["gsyvideoplayer-java","gsyvideoplayer-exo2","gsyvideoplayer-ex-so"]

使用

    //GSY
    //基础包
    implementation libs.gsyvideoplayer.java
    //是否需要ExoPlayer模式
    implementation libs.gsyvideoplayer.exo2
    //更多ijk的编码支持
    implementation libs.gsyvideoplayer.ex.so
  • 基础包是一定要使用的
  • 要支持回放所以官方的ExoPlayer会好一点
  • rtsp流的编码支持的so包,gsy直接帮我们编译好了直接引入就行还是很方便的
  • 也可以直接 libs.gsyvideoplayer,我这里只是为了方便解释写了三个(顺带一提versioncatlog的plugins好像有问题)

3. 常用代码

这是从文档直接拷贝过来的


//EXOPlayer内核,支持格式更多
PlayerFactory.setPlayManager(Exo2PlayerManager.class);
//系统内核模式
PlayerFactory.setPlayManager(SystemPlayerManager.class);
//ijk内核,默认模式
PlayerFactory.setPlayManager(IjkPlayerManager.class);
//aliplay 内核,默认模式
PlayerFactory.setPlayManager(AliPlayerManager.class);


//exo缓存模式,支持m3u8,只支持exo
CacheFactory.setCacheManager(ExoPlayerCacheManager.class);
//代理缓存模式,支持所有模式,不支持m3u8等,默认
CacheFactory.setCacheManager(ProxyCacheManager.class);



//切换渲染模式
GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL);
//默认显示比例
GSYVideoType.SCREEN_TYPE_DEFAULT = 0;
//16:9
GSYVideoType.SCREEN_TYPE_16_9 = 1;
//4:3
GSYVideoType.SCREEN_TYPE_4_3 = 2;
//全屏裁减显示,为了显示正常 CoverImageView 建议使用FrameLayout作为父布局
GSYVideoType.SCREEN_TYPE_FULL = 4;
//全屏拉伸显示,使用这个属性时,surface_container建议使用FrameLayout
GSYVideoType.SCREEN_MATCH_FULL = -4;
/***
 * SCREEN_TYPE_CUSTOM 下自定义显示比例
 * @param screenScaleRatio  高宽比,如 16:9
 */
public static void setScreenScaleRatio(float screenScaleRatio)


//切换绘制模式
GSYVideoType.setRenderType(GSYVideoType.SUFRACE);
GSYVideoType.setRenderType(GSYVideoType.GLSURFACE);
GSYVideoType.setRenderType(GSYVideoType.TEXTURE);


//ijk关闭log
IjkPlayerManager.setLogLevel(IjkMediaPlayer.IJK_LOG_SILENT);


//exoplayer自定义MediaSource
ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {
    @Override
    public MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {
        //可自定义MediaSource
        return null;
    }
});

rtsp流的优化

一些ijk设置项,在网上搜罗来自己删减添加了几条,延时从3秒降到7-800毫秒的样子

    /**
     * @time 2023/10/20 10:26
     * @Description: gsy针对ijk播放rtsp流的特殊设置
     */
    private fun setOptionModelList() {
        val list: MutableList<VideoOptionModel> = ArrayList()
        //软解码:1、打开,0、关闭
//        val videoOptionMode01 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "videotoolbox", 1)
        //开启硬解码
        val videoOptionMode01 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
        //rtsp设置 https://ffmpeg.org/ffmpeg-protocols.html#rtsp
        val videoOptionMode02 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp")
        val videoOptionMode03 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_flags", "prefer_tcp")
        //设置无packet缓存
        val videoOptionMode04 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0) //是否开启缓冲
        // 设置播放前的探测时间 1,达到首屏秒开效果
        val videoOptionMode05 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", 1)
        // 设置播放前的最大探测时间 (100未测试是否是最佳值)
        val videoOptionMode06 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100)
        // 每处理一个packet之后刷新io上下文
        val videoOptionMode07 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1)
        // 视频帧处理不过来的时候丢弃一些帧达到同步的效果
        val videoOptionMode08 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5)
        //设置无packet缓存
        val videoOptionMode09 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer")

        val videoOptionMode10 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 0)
        val videoOptionMode11 = VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mmediacodec-handle-resolution-change", 0)


        list.add(videoOptionMode01)
        list.add(videoOptionMode02)
        list.add(videoOptionMode03)
        list.add(videoOptionMode04)
        list.add(videoOptionMode05)
        list.add(videoOptionMode06)
        list.add(videoOptionMode07)
        list.add(videoOptionMode08)
        list.add(videoOptionMode09)
        list.add(videoOptionMode10)
        list.add(videoOptionMode11)

        GSYVideoManager.instance().optionModelList = list;
    }

然后播放一下

  mBinding.videoPlayer.setUp(
                it, true, ""
            )
            mBinding.videoPlayer.startPlayLogic()

大功告成

总结

本文介绍了开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化。首先介绍了GSYVideoPlayer的特点和优缺点,接着详细介绍了其简单使用的步骤和常用代码。最后,本文重点介绍了如何对GSYVideoPlayer播放rtsp流进行优化,在此过程中,介绍了一些常见的设置项,最终达成了延时降低的目的。

你可能感兴趣的:(开源)