FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
GSYVideoPlayer是一个国产的移动端视频播放器,它采用了IJKPlayer、Media3(EXOPlayer)、MediaPlayer、AliPlayer等四种播放器内核,支持弹幕、滤镜、广告等多项功能。
GSYVideoPlayer的Github主页为https://github.com/CarGuo/GSYVideoPlayer,截止2024年8月18日,该项目的Github星标数为2万,副本数为0.42万,这个成绩算是相当不错的了,要知道FFmpeg项目同期在Github的星标数也才4.44万。
不过在App工程中集成GSYVideoPlayer的话,得注意环境配置以免导入失败。具体的导入操作步骤说明如下:
一、安装Android Studio Jellyfish
虽然GSYVideoPlayer主页没有说明要在哪个版本的Android Studio中导入该库,但在实际操作中发现,即使是前两年推出的Android Studio Dolphin(小海豚版本)都无法正常导入GSYVideoPlayer,就更别说更早的Android Studio了。
若想正常导入并成功调用GSYVideoPlayer,还需安装较新的Android Studio,比如小水母版本的Android Studio Jellyfish。尽管小水母版本的新建App工程采用Kotlin编码,不过GSYVideoPlayer支持Java编码,所以仍然可以在Java代码中调用GSYVideoPlayer。
二、修改App工程的配置
首先打开App项目的settings.gradle,在repositories节点内部补充下面两行仓库配置,以便从指定仓库拉取GSYVideoPlayer库。
maven { url 'https://jitpack.io' }
maven { url "https://maven.aliyun.com/repository/public" }
接着打开App模块的build.gradle,在dependencies节点内部内部补充下面配置,表示引入9.0.0版本的GSYVideoPlayer库。
// 支持Java
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-java:v9.0.0-release-jitpack'
// 支持ExoPlayer模式
implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-exo2:v9.0.0-release-jitpack'
// 支持AliPlayer模式
implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-aliplay:v9.0.0-release-jitpack'
// 支持arm64指令集
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-arm64:v9.0.0-release-jitpack'
然后打开App模块的AndroidManifest.xml,补充下面的互联网权限配置:
<uses-permission android:name="android.permission.INTERNET" />
完成以上三处配置修改之后,才能在App代码中使用GSYVideoPlayer的播放器控件。
三、在App代码中使用播放器
GSYVideoPlayer提供了三种播放器控件,分别是NormalGSYVideoPlayer、GSYADVideoPlayer和ListGSYVideoPlayer,它们在App代码中的用法分别说明如下:
1、普通播放器NormalGSYVideoPlayer
NormalGSYVideoPlayer用来播放单个视频文件,在XML文件中放置该控件的代码如下所示:
<com.shuyu.gsyvideoplayer.video.NormalGSYVideoPlayer
android:id="@+id/video_player"
android:layout_width="match_parent"
android:layout_height="300dp" />
2、广告播放器GSYADVideoPlayer
GSYADVideoPlayer用来播放视频文件的片头广告,注意该控件要和NormalGSYVideoPlayer搭配使用。在XML文件中放置该控件的代码如下所示:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.shuyu.gsyvideoplayer.video.NormalGSYVideoPlayer
android:id="@+id/detail_player"
android:layout_width="match_parent"
android:layout_height="300dp" />
<com.shuyu.gsyvideoplayer.video.GSYADVideoPlayer
android:id="@+id/ad_player"
android:layout_width="match_parent"
android:layout_height="300dp"
android:visibility="gone" />
</RelativeLayout>
3、列表播放器ListGSYVideoPlayer
ListGSYVideoPlayer用来播放在时间上按顺序排成列表的若干视频文件,在XML文件中放置该控件的代码如下所示:
<com.shuyu.gsyvideoplayer.video.ListGSYVideoPlayer
android:id="@+id/detail_player"
android:layout_width="match_parent"
android:layout_height="300dp" />
在XML文件中放置上述三个播放器的任意一种控件之后,再回到Java代码执行视频播放操作。以NormalGSYVideoPlayer为例,通过Java播放单个视频文件的代码例子如下:
private static String URL_MP4 = "https://video.zohi.tv/fs/transcode/20240520/8cc/355193-1716184798-transv.mp4";
private NormalGSYVideoPlayer video_player;
private OrientationUtils orientationUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_player);
video_player = findViewById(R.id.video_player);
// 设置旋转
orientationUtils = new OrientationUtils(this, video_player);
// 设置全屏按键功能,这是使用的是选择屏幕,而不是全屏
video_player.getFullscreenButton().setOnClickListener(v -> {
// 不需要屏幕旋转,还需要设置 setNeedOrientationUtils(false)
orientationUtils.resolveByClick();
});
// 不需要屏幕旋转
video_player.setNeedOrientationUtils(false);
findViewById(R.id.btn_play_mp4).setOnClickListener(v -> {
video_player.setUp(URL_MP4, true, "数字中国峰会迎宾曲");
});
}
然后运行测试App,观察NormalGSYVideoPlayer播放网络视频的效果如下图所示:

因为NormalGSYVideoPlayer的播放内核基于IJKPlayer、EXOPlayer和AliPlayer,默认就支持HLS、RTMP等直播链接,所以无需改动代码,只要把视频地址换成以m3u8结尾的HLS链接,或者以rtmp开头的RTMP链接,即可让NormalGSYVideoPlayer播放直播内容。利用NormalGSYVideoPlayer播放直播视频的效果图如下所示:

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。
FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer的更多相关文章
- FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待 前言 将ffmpeg移植到海思H ...
- 树莓派开发笔记(十二):入手研华ADVANTECH工控树莓派UNO-220套件(一):介绍和运行系统
前言 树莓派也可以做商业应用,工业控制,其稳定性和可靠性已经得到了验证,故而工业控制,一些停车场等场景也有采用树莓派作为主控的,本片介绍了研华ADVANTECH的树莓派套件组UNO-220-P4N ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- .net开发笔记(十二) 设计时与运行时的区别(续)
上一篇博客详细讲到了设计时(DesignTime)和运行时(RunTime)的概念与区别,不过没有给出实际的Demo,今天整理了一下,做了一个例子,贴出来分享一下,巩固前一篇博客讲到的内容. 简单回顾 ...
- 安卓开发笔记(十二):SQLite数据库储存(上)
SQLite数据库存储(上) 创建数据库 Android专门提供了一个 SQLiteOpenHelper帮助类对数据库进行创建和升级 SQLiteOpenHelper需要创建一个自己的帮助类去继承它并 ...
- 论文阅读笔记五十二:CornerNet-Lite: Efficient Keypoint Based Object Detection(CVPR2019)
论文原址:https://arxiv.org/pdf/1904.08900.pdf github:https://github.com/princeton-vl/CornerNet-Lite 摘要 基 ...
- Java开发笔记(十二)布尔变量论道与或非
在编程语言的设计之初,它们除了可以进行数学计算,还常常用于逻辑推理和条件判断.为了实现逻辑判断的功能,Java引入了一种布尔类型boolean,用来表示“真”和“假”.该类型的变量只允许两个取值,即t ...
- PID控制器开发笔记之十二:模糊PID控制器的实现
在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题.模糊PID控制器是将模糊算法与PID控 ...
- ESP32 开发笔记(十二)LittlevGL 添加自定义字体和物理按键
LittlevGL 添加自定义字体获取字库 ttf 文件可以从一些网站上获取字库文件,比如请注意字体许可证 生成源文件使用 LittlevGL 提供的字库文件转换工具,将 ttf 字库文件转换为源文件 ...
- Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件
前言 上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤. 受限制 因为直接配置sample的vi比较麻烦 ...
随机推荐
- Java实现快速快速排序算法
算法简介 快速排序(Quick Sort) 是由冒泡排序改进而得的.在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序.如果能通过两个(不相邻)记录的一次交换直接 ...
- [oeasy]python0094_视频游戏_双人网球_pong_atari_mos_6502_雅达利_米洛华
编码进化 回忆上次内容 上次 我们回顾了 微软之前的 比尔盖茨和保罗艾伦 mits 迎来的 是帮手 还是隐患? intel-8080 遇到了 mos-6502 底层硬件 驱动 游戏行业进化 不光是扑克 ...
- oeasy教您玩转vim - 65 - # 批处理操作
批处理操作 回忆上次 我们上次参数列表 arguments list 所谓参数列表指的是 vim 打开的 参数列表 参数会加载到内存中成为 buffer 参数的控制 :arga filename ...
- SQL分析“聚集索引、非聚集索引”区别
概述 聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序,因此一 ...
- 前端说你的API接口太慢了,怎么办?
当有千万条海量数据时,前端调取接口发现接口响应的太慢,前端这时让你优化一下接口,你说有几千万条数据,觉得自己尽力了,前端觉得你好菜,别急,读完这篇文章,让前端喊你一声:大佬,厉害!!! 常用的方法总结 ...
- CF1950B Upscaling题解
CF1950B Upscaling题解 题意 给予你一个正整数 \(n\),构造一个如图的字符矩阵. 思路 注意数据 \(1\le n \le 20\),可以发现数据很小,于是我们可以暴力模拟. 我们 ...
- java开发环境安装IDEA+jdk1.8
一. 需要得安装包 (1)IDEA破解版.zip (2)jdk1.8.0_25.7z 获取方式(免费): (1) 登录-注册:http://resources.kittytiger.cn/ ...
- yum密钥报错
解决报错 [root@node3 mnt]# cat /etc/yum.repos.d/local.repo [BaseOS_repo] baseurl = file:///mnt/BaseOS en ...
- Mysql查询几天前或几天后的日期
查询 当天±天数 后的日期."-14"表示14天前的日期,"14"表示14天后的日期 NOW()精确到时分秒,CURDATE()只精确到天 #查询今天 1.se ...
- python 中 ctypes 的使用尝试
最近在看Python的性能优化方面的文章,突然想起ctypes这个模块,对于这个模块一直不是很理解,不过再次看完相关资料有了些新的观点. ctypes 这个模块个人观点就是提供一个Python类型与C ...