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



    在这里插入图片描述

    前言

    本文介绍,开源播放器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" }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用

        //GSY
        //基础包
        implementation libs.gsyvideoplayer.java
        //是否需要ExoPlayer模式
        implementation libs.gsyvideoplayer.exo2
        //更多ijk的编码支持
        implementation libs.gsyvideoplayer.ex.so
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 基础包是一定要使用的
    • 要支持回放所以官方的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;
        }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    rtsp流的优化

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

        /**
         * @time 2023/10/20 10:26
         * @Description: gsy针对ijk播放rtsp流的特殊设置
         */
        private fun setOptionModelList() {
            val list: MutableList<VideoOptionModel> = ArrayList()
            //开启软解码,硬解码
            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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    然后播放一下

      mBinding.videoPlayer.setUp(
                    it, true, ""
                )
                mBinding.videoPlayer.startPlayLogic()
    
    • 1
    • 2
    • 3
    • 4

    大功告成

    总结

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

  • 相关阅读:
    Python将字符串转换成dataframe
    开放签电子签章企业版V1.6(紧急更新)
    清理docker 占用空间,volume挂载过大,清除镜像,容器,挂载数据
    Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
    LeetCode 69. x 的平方根
    CVPR‘23投稿量再创新高? CCF会议投稿量大比拼, 谁才是卷王?
    Codeforces Round #800 (Div. 2)
    【图像去噪】【TGV 正则器的快速计算方法】通过FFT的总(广义)变化进行图像去噪(Matlab代码实现)
    基于Echarts实现可视化数据大屏大数据中心可视化平台模板
    中间件 | Redis - [redis]
  • 原文地址:https://blog.csdn.net/shop_and_sleep/article/details/134154199