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

news2025/7/21 19:46:44

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

  • 前言
  • 一、GSYVideoPlayer🔥🔥🔥是什么?
  • 二、简单使用
    • 1.First、在project下的build.gradle添加
    • 2.按需导入
    • 3. 常用代码
  • 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" }
    }
}

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流进行优化,在此过程中,介绍了一些常见的设置项,最终达成了延时降低的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器

文章目录 引言Kafka Eagle简介Kafka Eagle的特点Kafka Eagle的优势使用Kafka Eagle的步骤结论 引言 在现代大数据架构中&#xff0c;Apache Kafka已成为一个不可或缺的组件&#xff0c;用于可靠地处理和传输大规模的数据流。然而&#xff0c;随着Kafka集群规模的不断增长&…

私募证券基金动态-23年9月报

成交量&#xff1a;9月日均7,197.15亿元 2023年9月A股两市日均成交7,197.15亿元&#xff0c;环比下降12.78%、同比下降1.38%&#xff0c;为近2年单月日均成交最低的月份。9月整体20个交易日&#xff0c;单日成交金额最高没有过万亿&#xff0c;单日最低破6000亿&#xff0c;仅…

博弈论学习笔记(2)——完全信息静态博弈

前言 这部分我们学习的是完全信息静态博弈&#xff0c;主要内容包括博弈论的基本概念、战略式博弈、Nash均衡、Nash均衡解的特性、以及Nash均衡的应用。 零、绪论 1、什么是博弈论 1&#xff09;博弈的定义 博弈论&#xff1a;研究决策主体的行为发生直接相互作用时候的决策…

蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)

目录 1、求和 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 1、求和 题目&#xff1a; 思路&#xff1a; 1、首先想到的是两重遍历&#xff0c;累加和。但是当n取200000时&#xff0c;会超时&#xff0c;所以暴力的遍历没有办法通过全部案例。 2、将公式变形得到…

AI先行者第一辑:AI for Science 要坚持高压强投入

‍‍ 中国在AI for Science的基础还非常的薄弱&#xff0c;且非短期内可以提升&#xff0c;需要有一个长期性的计划&#xff0c;也需要有足够的金钱投入和人才队伍建设。 本篇作者褚学森&#xff0c;中国船舶科学研究中心、深海技术科学太湖实验室 研究员&#xff1b;新兴技术研…

代码随想录算法训练营第四十天丨 动态规划part03

343. 整数拆分 思路 看到这道题目&#xff0c;都会想拆成两个呢&#xff0c;还是三个呢&#xff0c;还是四个.... 来看一下如何使用动规来解决。 动态规划 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]…

DNS 域名解析系统

文章目录 前言什么是 DNS 域名解析系统为什么需要 DNS 域名解析DNS 是如何发展的hosts 文件维护域名和IP的映射关系DNS 系统&#xff08;服务器&#xff09;DNS 镜像系统 前言 前面为大家分享了关于计算机网络中应用层——自定义协议、传输层——UDP、TCP 协议、网络层——IP协…

怎样用ps把人物皮肤磨皮,人物皮肤磨皮怎么办

品牌型号:联想GeekPro 2020 系统: Windows 10 64位专业版 软件版本: portraiture 3.5.6 皮肤瑕疵是人像拍摄中比较容易出现的问题&#xff0c;对于皮肤瑕疵后期一般会使用磨皮的方法处理。那么&#xff0c;怎样用ps把人物皮肤磨皮&#xff1f;ps磨皮的工具丰富多样&#xff…

如何在不同的系统中查找IP地址

知道如何找到你的IP地址是我们大多数人在日常生活中很少使用的技能&#xff0c;但当你需要的时候&#xff0c;这是一种你会感激的技能——尤其是如果你运行的是最好的Wi-Fi路由器之一。 当你从事家庭网络项目时&#xff0c;知道你的IP地址很重要&#xff0c;一旦你知道了基本知…

倾斜摄影三维模型数据几何坐标重建方法分析

倾斜摄影三维模型数据几何坐标重建方法分析 利用几何坐标变换等技术实现倾斜摄影三维模型数据的坐标重建&#xff0c;可以采用以下方法&#xff1a; 1、数据准备&#xff1a;首先&#xff0c;需要获取倾斜摄影影像数据。这些影像应包含多个视角下的拍摄图像&#xff0c;并覆盖…

docker--基本操作

第 1 章 Docker基础 1.1 docker简介 在这一部分我们主要讲两个方面&#xff1a; docker是什么、docker特点 1.1.1 docker是什么 docker是什么&#xff1f; docker的中文解释是码头工人。 官方解释&#xff1a; Docker是一个开源的容器引擎&#xff0c;它基于LCX容器技术&…

最新广告联盟系统源码/实时监控移动广告联盟系统/多元化合作推广方式+支持各种广告效果

源码简介&#xff1a; 最新广告联盟系统源码&#xff0c;作为实时监控移动广告联盟&#xff0c;它有着多元化合作推广方式&#xff0c;并支持各种广告效果。它是最新版本、功能强大的广告联盟系统。 诚丰广告联盟系统的单台服务器每天能够承受至少2000万个PV流量&#xff0c;并…

前端(二十六)——常见的HTTP异常状态码以及正反向代理配置

&#x1f475;博主&#xff1a;小猫娃来啦 &#x1f475;文章核心&#xff1a;前端常见的HTTP异常状态码以及正反向代理配置 文章目录 前端常见的HTTP异常状态码404 - 未找到资源403 - 禁止访问304 - 未修改500 - 服务器内部错误 正反向代理配置重要性本地正向代理配置服务器配…

GhostNet(CVPR 2020)学习笔记 (附代码)

论文地址&#xff1a;​​​​​​https://arxiv.org/abs/1911.11907v2 代码地址&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/ghostnet_pytorch/ghostnet.py 1.是什么&#xff1f; Ghost module是一种模型压缩的方法&#xff0c;它可以…

韦东山D1S板子——利用xfel工具初始化内置64MB内存,并直接下载程序到内存运行

1、前言 &#xff08;1&#xff09;最近使用韦东山老师的D1S板子学习RISC-V架构知识&#xff0c;我是结合《RISC-V体系结构编程与实践》这本书的进行学习&#xff0c;其中韦东山老师对书中的代码做了部分移植&#xff0c;到MMU模块就没有在移植书中代码&#xff1b; &#xff0…

从小白到大牛:Linux嵌入式系统开发的完整指南

Linux嵌入式系统开发一直是一个激动人心的领域&#xff0c;吸引着越来越多的开发者。无论你是初学者还是已经有一些经验的开发者&#xff0c;本文将为你提供从小白到大牛的完整指南&#xff0c;帮助你掌握Linux嵌入式系统开发的关键概念和技能。我们将深入探讨Linux内核、设备驱…

从开发者的角度看K8S中的复合容器模式

就应用设计最佳实践和原则而言&#xff0c;构建复杂的基于容器的架构与编程没有太大区别。本文的目标是使用众所周知的编程原理从开发人员的角度展示三种流行的可扩展性架构模式。 让我们从单一职责原则开始。根据 R. Martin 的说法&#xff0c;“一个类应该只有一个改变的理由…

高性能渲染——详解Html Canvas的优势与性能

本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 一、什么是Canvas 想必学习前端的同学们对Canvas 都不陌生&#xff0c;它是 HTML5 新增的“画布”元素&#x…

污水一体处理设备工艺有哪些

污水一体处理设备工艺主要包括以下几种&#xff1a; AO工艺&#xff1a;AO工艺是增加好氧池缺氧池形成硝化-反硝化系统&#xff0c;处理污水中氮含量效率提升。SBR工艺&#xff1a;SBR工艺是按间歇曝气方式运行的活性污泥处理技术&#xff0c;厌氧、好氧、缺氧处于交替状态&am…

选择适合制造业的企业邮箱平台

自2010年成立以来&#xff0c;J公司已从一家小型有限责任公司发展成为全球领先的工业内窥镜研发、生产和销售企业。公司的产品制造采用国际先进技术和一流生产工艺&#xff0c;专业为客户提供定制解决方案&#xff0c;产品已广泛应用于锅检特检、机械制造、发电、石油、燃气、化…