当前位置: 首页 > news >正文

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

开源播放器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() {@Overridepublic MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {//可自定义MediaSourcereturn 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#rtspval 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流进行优化,在此过程中,介绍了一些常见的设置项,最终达成了延时降低的目的。

相关文章:

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

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、简单使用1.First、在project下的build.gradle添加2.按需导入3. 常用代码 rtsp流的优化大功告成 总结 前言 本文介绍&#xff0c;…...

安卓手机数据恢复工具 DiskDigger Pro 中文版-适用于已获得 root 权限的设备!可以从您的存储卡或内存恢复数据

可以从您的存储卡或内存中取消删除和恢复丢失的照片、文档、视频、音乐等。 无论您是不小心删除了文件&#xff0c;还是重新格式化了存储卡&#xff0c;DiskDigger 强大的数据恢复功能都可以找到您丢失的文件并让您恢复它们。 注意&#xff1a;如果您的设备未获得 root 权限&a…...

Python 生成Android不同尺寸的图标

源代码 # -*- coding: utf-8 -*- import sys import os import shutil from PIL import Imagedef generateAndroidIcons():imageSource icon.pngicon Image.open(imageSource)sizes [(android/drawable,512),(android/drawable-hdpi,72),(android/drawable-ldpi,36),(andro…...

PHP使用GuzzleHttp进行HTTP请求

1,composer安装 composer require guzzlehttp/guzzle:~7.0 2&#xff0c;设置过期时间和跳过ssl验证 use GuzzleHttp\Client;$clientnew Client([timeout > 5, verify > false]);2&#xff0c;get请求 use GuzzleHttp\Client;$clientnew Client([timeout > 5, verif…...

pytorch笔记:allclose,isclose,eq,equal

1 allclose 1.1介绍 torch.allclose是一个PyTorch函数&#xff0c;用于检查两个张量是否在某个容忍度范围内近似相等 torch.allclose(input, other, rtol1e-05, atol1e-08, equal_nanFalse)input (Tensor) – 第一个输入张量other (Tensor) – 第二个输入张量rtol (float) –…...

YoloV8修改检测框为中心点

代码实现参考&#xff1a; https://github.com/computervisioneng/train-yolov8-custom-dataset-step-by-step-guide/blob/master/local_env/predict_video.py from ultralytics import YOLO from PIL import Image import cv2 import numpy as npmodel YOLO("/home/ps…...

文言一心中将C语言归类为低级语言,这对么?

文言一心中将C语言归类为低级语言&#xff0c;这对么? 以下是文言一心中的回答&#xff1a;C语言属于低级语言。低级语言通常指的是接近于机器语言的编程语言&#xff0c;它们与计算机硬件的交互更加直接&#xff0c;能够更高效地利用计算机资源。最近很多小伙伴找我&#xff…...

[补题记录] Codeforces Round 906 (Div. 2)(A~D)

URL&#xff1a;https://codeforces.com/contest/1890 目录 A Problem/题意 Thought/思路 Code/代码 B Problem/题意 Thought/思路 Code/代码 C Problem/题意 Thought/思路 Code/代码 D Problem/题意 Thought/思路 Code/代码 A Problem/题意 给出一个数组 A…...

Kubernetes yaml文件

目录 yaml文件 Pod yaml文件详解 deployment.yaml文件详解 Service yaml文件详解 文件 Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消息的传递 YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性…...

Linux——切换CUDA版本

一、查看本地cuda版本 cd /usr/local/ ls当前cuda为软连接&#xff0c;指向指定的cuda版本 stat cuda # 查看当前cuda状态信息二、切换CUDA版本 # 删除原有软连接 sudo rm -rf /usr/local/cuda # 建立需要切换的cuda软连接版本 sudo ln -s /usr/local/cuda-**.* /usr/l…...

利用云计算和微服务架构开发可扩展的同城外卖APP

如今&#xff0c;同城外卖APP已经成为了人们点餐的主要方式之一。然而&#xff0c;要构建一款成功的同城外卖APP&#xff0c;不仅需要满足用户的需求&#xff0c;还需要具备可扩展性&#xff0c;以适应快速增长的用户和订单量。 一、了解同城外卖APP的需求 在着手开发同城外卖…...

数据结构详细笔记——二叉树

文章目录 二叉树的定义和基本术语特殊的二叉树满二叉树完全二叉树二叉排序树平衡二叉树 二叉树的常考性质完全二叉树的常考性质二叉树的存储结构顺序存储链式存储 二叉树的先中后序遍历先序遍历&#xff08;空间复杂度&#xff1a;O&#xff08;h&#xff09;&#xff09;中序遍…...

react实现列表增删改查的小demo(class组件版)

前言 react的语法上就是比vue麻烦不少,既然要开手动挡,那就开吧,一个基础的demo 效果图 列表 新增弹窗 编辑弹框 新增一条数据后的效果 代码 根组件 index.jsx import React, { Component,createRef} from react import withRouter from ../../utils/withRouter import G…...

运行批处理文件,Windows 10至少提供了三种方法,有的可以设置定时运行

Windows 10至少有三种写入批处理文件的方法。你可以使用命令提示符或文件资源管理器按需运行它们。你可以使用任务计划程序配置脚本,以便按计划运行。或者,你可以将批处理文件保存在“启动”文件夹中,让系统在你登录帐户后立即运行它们。 如果要按需运行脚本,可以使用文件…...

C++ detach线程的归属权和控制权交给runtime library的原因

在C中&#xff0c;std::thread的detach操作将线程的归属权和控制权都转移给了C运行时库&#xff08;runtime library&#xff09;。这是因为detach操作的目的是告诉C运行时库&#xff0c;你不再关心这个线程的状态&#xff0c;它可以在后台独立运行&#xff0c;而不需要等待主线…...

Android应用集成RabbitMQ消息处理指南

Android应用集成RabbitMQ消息处理指南 RabbitMQ1、前言2、RabbitMQ简介2.1、什么是RabbitMQ2.2、RabbitMQ的特点2.3、RabbitMQ的工作原理2.4、RabbitMQ中几个重要的概念 3、在Android Studio中集成RabbitMQ3.1、在Manifest中添加权限&#xff1a;3.2、在build.gradle(:app)下添…...

爆改86㎡户型,中式禅意,自然诗意!福州中宅装饰,福州装修

自然诗意 中式禅意 东方风韵&#xff0c;涟漪泛晕。 ——致生活感的“空间”&#xff0c;最美的家 案例简介 作品&#xff1a;泛晕 风格&#xff1a;新中式 面积&#xff1a;86平方 楼盘&#xff1a;长乐中南樾府 中国风与现代风混搭 木元素是中国风表达中最具灵魂般的存…...

LVGL库入门 02 - 布局

1、简单布局 可以使用 lv_obj_set_pos(obj, x, y) 调整一个控件的位置&#xff08;或者使用类似的函数单独调整一个方向的坐标&#xff09;&#xff0c;将它放在相对父容器左上角的合适位置。不过这种布局方式非常死板&#xff0c;因为绝对坐标一旦设定就不能自动调整&#xf…...

利用Vue2实现印章徽章组件

需要实现的组件效果&#xff1a; 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 <template><divclass"first-ring"v-bind"getBindValue":class"getStampBadgeClass":style"{ transform: rotate(${rotate}…...

金麟国际用工-全新蓝领跨境就业服务平台

金麟国际用工-全新蓝领跨境就业服务平台 金麟国际用工平台是一个引领时代的蓝领跨境就业服务平台&#xff0c;专为蓝领求职者和雇主提供一个全面、便捷、高效的就业对接环境。这个平台通过其强大的数字化系统&#xff0c;包括客户管理系统、岗位信息系统和智能营销工具等&…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...