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

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

多模态大语言模型arxiv论文略读(110)

CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文标题&#xff1a;CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文作者&#xff1a;Hidehisa Arai, Keita Miwa, Kento Sasaki, Yu Yamaguchi, …...

Python打卡训练营学习记录Day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...