当前位置: 首页 > 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;包括客户管理系统、岗位信息系统和智能营销工具等&…...

Pytest参数化测试中文乱码?这2个隐藏技巧让你的测试报告清晰可读

Pytest参数化测试中文乱码&#xff1f;这2个隐藏技巧让你的测试报告清晰可读 在Python自动化测试领域&#xff0c;Pytest凭借其简洁的语法和强大的功能已成为开发者的首选工具。特别是它的参数化测试功能&#xff0c;能够高效验证多组输入数据下的代码行为。但当我们尝试用中文…...

PlugY终极指南:暗黑破坏神2单机玩家的生存套件完整教程

PlugY终极指南&#xff1a;暗黑破坏神2单机玩家的生存套件完整教程 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神2单机模式储物空间不足而烦恼吗&…...

用CodeBuddy在10分钟内搭建个人技术博客(含GitHub Pages部署教程)

用CodeBuddy在10分钟内搭建个人技术博客&#xff08;含GitHub Pages部署教程&#xff09; 在数字时代&#xff0c;拥有一个个人技术博客已成为开发者展示专业能力、分享技术见解的重要方式。本文将带你使用CodeBuddy这一智能编程助手&#xff0c;快速构建专业级技术博客&#x…...

为什么选择Clef Handbook:15个创新政策彻底改变传统雇佣关系

为什么选择Clef Handbook&#xff1a;15个创新政策彻底改变传统雇佣关系 【免费下载链接】handbook An employee handbook built for inclusion 项目地址: https://gitcode.com/gh_mirrors/handbook6/handbook Clef Handbook是一份为包容性而构建的员工手册&#xff08;…...

从手动到工具,我降AI率的方法进化史

从手动到工具&#xff0c;我降AI率的方法进化史 从2024年初开始用AI辅助写论文&#xff0c;到2026年毕业&#xff0c;我的降AI率方法经历了三次进化。 每次进化都不是主动选择&#xff0c;而是被逼的——上一个方法撞了墙&#xff0c;不得不换。 把这个过程写出来&#xff0…...

C++ 子数组位运算结果 题型

或运算 898. 子数组按位或操作 - 力扣&#xff08;LeetCode&#xff09; 我们直接看题&#xff0c;意思很明显&#xff0c;就是找出所有子数组&#xff0c;然后将子数组各个数相或得到的结果有多少个不同。 这里我们首先想到的就是直接把所有子数组求出来在或起来&#xff0c…...

单轮车辆ABS防抱死控制Simulink仿真模型 1.可控制切换冰雪路面和开关ABS系统控制 2.仿真输出时域下的车速/轮速/制动距离/滑移率/控制信号曲线,可以配置车重/滑移率-摩擦系数曲线/主缸

单轮车辆ABS防抱死控制Simulink仿真模型 1.可控制切换冰雪路面和开关ABS系统控制 2.仿真输出时域下的车速/轮速/制动距离/滑移率/控制信号曲线&#xff0c;可以配置车重/滑移率-摩擦系数曲线/主缸压力/制动效能因数等参数。 3.有基础说明文档单轮车辆ABS防抱死控制Simulink仿真…...

ai一键生成tomcat配置脚本,三分钟搞定java web服务器环境搭建

今天想和大家分享一个超级实用的技巧——如何用AI工具快速搞定Tomcat服务器的安装和配置。作为一个Java Web开发者&#xff0c;每次在新环境搭建Tomcat总免不了要折腾半天&#xff0c;直到发现了InsCode(快马)平台的AI生成功能&#xff0c;整个过程变得异常简单。 环境自动适配…...

Spring AI聊天记录丢了怎么办?手把手教你用Redis实现ChatMemory持久化(附完整代码)

Spring AI聊天记录持久化实战&#xff1a;Redis解决方案与工程实践 在构建智能对话系统时&#xff0c;聊天记录的持久化是一个经常被忽视却至关重要的环节。想象一下这样的场景&#xff1a;用户昨天与你的客服机器人进行了长达30分钟的咨询&#xff0c;今天再次访问时却发现系统…...

告别重复编码:用快马AI自动生成数据库增删改查代码,效率提升300%

今天想和大家分享一个提升开发效率的实用技巧——如何用InsCode(快马)平台快速生成数据库相关代码。作为一个经常需要开发库存管理系统的程序员&#xff0c;我发现每次从零开始写数据库模块特别耗时&#xff0c;特别是那些重复的增删改查代码。最近尝试用快马平台后&#xff0c…...