Convert Figma logo to code with AI

CarGuo logoGSYVideoPlayer

视频播放器(IJKplayer、ExoPlayer、MediaPlayer),HTTPS,16k page size,支持弹幕,外挂字幕,支持滤镜、水印、gif截图,片头广告、中间广告,多个同时播放,支持基本的拖动,声音、亮度调节,支持边播边缓存,支持视频自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,列表切换详情页面无缝播放,rtsp、concat、mpeg。

20,157
4,186
20,157
16

Top Related Projects

32,485

Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.

21,714

This project is deprecated and stale. The latest ExoPlayer code is available in https://github.com/androidx/media

Android开源弹幕引擎·烈焰弹幕使 ~

Infinite cycle ViewPager with two-way orientation and interactive effect.

MediaPlayer exoplayer ijkplayer ffmpeg

This is a project designed to help controlling Android MediaPlayer class. It makes it easier to use MediaPlayer ListView and RecyclerView. Also it tracks the most visible item in scrolling list. When new item in the list become the most visible, this library gives an API to track it.

Quick Overview

GSYVideoPlayer is a comprehensive video player for Android that supports multiple video formats and customizable UI components. It offers a wide range of features including gesture controls, video caching, and various display modes, making it suitable for both simple and complex video playback requirements in Android applications.

Pros

  • Extensive feature set, including support for multiple video formats, gesture controls, and customizable UI
  • Active development and maintenance, with regular updates and bug fixes
  • Good documentation and examples, making it easier for developers to integrate and use
  • Supports both ExoPlayer and IJKPlayer as underlying video engines

Cons

  • Large library size due to its comprehensive feature set, which may impact app size
  • Steeper learning curve compared to simpler video player libraries
  • Some users report occasional performance issues with certain video formats or devices
  • Limited support for iOS platforms (primarily focused on Android)

Code Examples

  1. Basic video playback:
val videoPlayer = StandardGSYVideoPlayer(context)
videoPlayer.setUp("https://example.com/video.mp4", true, "Video Title")
videoPlayer.startPlayLogic()
  1. Customizing player controls:
val videoPlayer = StandardGSYVideoPlayer(context)
videoPlayer.titleTextView.visibility = View.GONE
videoPlayer.backButton.visibility = View.VISIBLE
videoPlayer.fullscreenButton.setOnClickListener {
    videoPlayer.startWindowFullscreen(context, true, true)
}
  1. Implementing gesture controls:
val videoPlayer = StandardGSYVideoPlayer(context)
videoPlayer.setGestureListener(object : GSYVideoGestureListener {
    override fun onBrightnessGesture(percent: Float) {
        // Handle brightness gesture
    }
    override fun onVolumeGesture(percent: Float) {
        // Handle volume gesture
    }
    override fun onSeekGesture(seekTime: Long, totalTime: Long) {
        // Handle seek gesture
    }
})

Getting Started

  1. Add the dependency to your app's build.gradle:
dependencies {
    implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer:v8.3.5-release-jitpack'
}
  1. Add the following to your project's build.gradle:
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
  1. In your layout XML, add the video player view:
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
    android:id="@+id/video_player"
    android:layout_width="match_parent"
    android:layout_height="200dp" />
  1. In your activity or fragment, initialize and use the video player:
val videoPlayer = findViewById<StandardGSYVideoPlayer>(R.id.video_player)
videoPlayer.setUp("https://example.com/video.mp4", true, "Video Title")
videoPlayer.startPlayLogic()

Competitor Comparisons

32,485

Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.

Pros of ijkplayer

  • More mature and widely adopted, with extensive community support
  • Better performance for low-latency streaming and live video playback
  • Supports a broader range of video formats and codecs

Cons of ijkplayer

  • Less actively maintained, with fewer recent updates
  • More complex setup and integration process
  • Limited built-in UI components and customization options

Code Comparison

ijkplayer:

IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();
ijkMediaPlayer.setDataSource(videoPath);
ijkMediaPlayer.prepareAsync();
ijkMediaPlayer.start();

GSYVideoPlayer:

StandardGSYVideoPlayer videoPlayer = new StandardGSYVideoPlayer(this);
videoPlayer.setUp(videoPath, true, "Video Title");
videoPlayer.startPlayLogic();

Summary

ijkplayer is a powerful, low-level video player library with excellent performance and format support. It's ideal for projects requiring fine-grained control over video playback and streaming. However, it may require more development effort to implement custom UI and features.

GSYVideoPlayer, on the other hand, offers a more user-friendly approach with pre-built UI components and easier integration. It's better suited for projects that prioritize quick implementation and customizable user interfaces but may not require the same level of performance or format support as ijkplayer.

21,714

This project is deprecated and stale. The latest ExoPlayer code is available in https://github.com/androidx/media

Pros of ExoPlayer

  • Developed and maintained by Google, ensuring high-quality and regular updates
  • Extensive documentation and community support
  • Supports a wide range of media formats and streaming protocols

Cons of ExoPlayer

  • Steeper learning curve for beginners
  • Requires more setup and configuration compared to GSYVideoPlayer
  • Limited built-in UI components, requiring more custom development

Code Comparison

ExoPlayer:

val player = SimpleExoPlayer.Builder(context).build()
player.setMediaItem(MediaItem.fromUri(videoUri))
player.prepare()
player.play()

GSYVideoPlayer:

val videoPlayer = GSYVideoManager.instance().videoPlayer
videoPlayer.setUp(videoUrl, true, "Video Title")
videoPlayer.startPlayLogic()

ExoPlayer provides more granular control over player initialization and media loading, while GSYVideoPlayer offers a more streamlined setup process with fewer lines of code. ExoPlayer's approach allows for greater customization, but GSYVideoPlayer's simplicity may be preferable for basic use cases.

Both libraries offer powerful video playback capabilities, with ExoPlayer providing a more comprehensive solution for complex media playback scenarios, and GSYVideoPlayer offering a more user-friendly approach for simpler implementations.

Android开源弹幕引擎·烈焰弹幕使 ~

Pros of DanmakuFlameMaster

  • Specialized in handling danmaku (bullet comments) for video players
  • Lightweight and focused on a specific feature set
  • Optimized for performance in rendering large numbers of comments

Cons of DanmakuFlameMaster

  • Limited to danmaku functionality, not a full-featured video player
  • May require integration with other libraries for complete video playback
  • Less active development compared to GSYVideoPlayer

Code Comparison

DanmakuFlameMaster:

DanmakuContext context = DanmakuContext.create();
context.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3)
       .setScrollSpeedFactor(1.2f)
       .setScaleTextSize(1.2f);
mDanmakuView.prepare(parser, context);
mDanmakuView.showFPS(true);

GSYVideoPlayer:

StandardGSYVideoPlayer videoPlayer = new StandardGSYVideoPlayer(this);
videoPlayer.setUp(url, true, "Title");
videoPlayer.startPlayLogic();

While DanmakuFlameMaster focuses on danmaku rendering configuration, GSYVideoPlayer provides a more comprehensive video player setup. GSYVideoPlayer offers a wider range of features for video playback, while DanmakuFlameMaster excels in specialized bullet comment functionality.

Infinite cycle ViewPager with two-way orientation and interactive effect.

Pros of InfiniteCycleViewPager

  • Specialized for creating infinite cycling view pagers with smooth animations
  • Supports both horizontal and vertical orientations
  • Customizable with various animation modes and transformation effects

Cons of InfiniteCycleViewPager

  • Limited to view pager functionality, not a full-featured video player
  • May require additional implementation for video playback features
  • Less actively maintained compared to GSYVideoPlayer

Code Comparison

InfiniteCycleViewPager:

InfiniteCycleViewPager infiniteCycleViewPager = findViewById(R.id.infinite_cycle_view_pager);
infiniteCycleViewPager.setAdapter(new MyPagerAdapter(this));
infiniteCycleViewPager.setScrollDuration(500);
infiniteCycleViewPager.setMediumScaled(true);
infiniteCycleViewPager.setMaxPageScale(0.8f);

GSYVideoPlayer:

StandardGSYVideoPlayer videoPlayer = findViewById(R.id.video_player);
videoPlayer.setUp("http://example.com/video.mp4", true, "Video Title");
videoPlayer.startPlayLogic();
videoPlayer.setLooping(true);
videoPlayer.setShowFullAnimation(true);

While InfiniteCycleViewPager excels in creating smooth, cyclic view pagers, GSYVideoPlayer is a more comprehensive solution for video playback with extensive features and customization options. The choice between the two depends on the specific requirements of your project, whether you need a specialized view pager or a full-featured video player.

MediaPlayer exoplayer ijkplayer ffmpeg

Pros of JiaoZiVideoPlayer

  • Simpler implementation and easier to use for basic video playback needs
  • Lighter weight with fewer dependencies, potentially resulting in a smaller app size
  • More straightforward customization options for basic UI elements

Cons of JiaoZiVideoPlayer

  • Less comprehensive feature set compared to GSYVideoPlayer
  • Limited support for advanced playback options and formats
  • Fewer active updates and maintenance in recent years

Code Comparison

JiaoZiVideoPlayer:

JzvdStd jzvdStd = findViewById(R.id.jz_video);
jzvdStd.setUp("http://jzvd.nathen.cn/c6e3dc12a1154626b3476d9bf3bd7266/6b56c5f0dc31428083757a45764763b0-5287d2089db37e62345123a1be272f8b.mp4"
              , "Title");
jzvdStd.posterImageView.setImage("http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640");

GSYVideoPlayer:

StandardGSYVideoPlayer videoPlayer = findViewById(R.id.video_player);
videoPlayer.setUp("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4"
                  , true, "Title");
videoPlayer.setLooping(true);
videoPlayer.getBackButton().setVisibility(View.GONE);

Both libraries offer simple setup for basic video playback, but GSYVideoPlayer provides more configuration options out of the box, such as looping and UI customization.

This is a project designed to help controlling Android MediaPlayer class. It makes it easier to use MediaPlayer ListView and RecyclerView. Also it tracks the most visible item in scrolling list. When new item in the list become the most visible, this library gives an API to track it.

Pros of VideoPlayerManager

  • Lightweight and focused on video playback management
  • Supports multiple video players on a single screen
  • Easier to integrate into existing projects due to its simplicity

Cons of VideoPlayerManager

  • Less feature-rich compared to GSYVideoPlayer
  • Limited customization options for the video player UI
  • Fewer built-in gestures and controls

Code Comparison

VideoPlayerManager:

val videoPlayerManager = SingleVideoPlayerManager(PlayerItemChangeListener())
videoPlayerManager.playNewVideo(null, videoPlayerView, "http://example.com/video.mp4")

GSYVideoPlayer:

StandardGSYVideoPlayer videoPlayer = new StandardGSYVideoPlayer(this);
videoPlayer.setUp("http://example.com/video.mp4", true, "Video Title");
videoPlayer.startPlayLogic();

Summary

VideoPlayerManager is a lightweight solution focused on managing multiple video players, making it easier to integrate into existing projects. However, it lacks the extensive features and customization options offered by GSYVideoPlayer. GSYVideoPlayer provides a more comprehensive video playback solution with advanced features, gestures, and UI customization options, but may be overkill for simpler use cases.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

支持 IJKPlayer、 Media3(EXOPlayer2)、MediaPlayer、AliPlayer,实现了多功能的视频播放器。 (请仔细阅读下方各项说明,大多数问题可在下方找到解答)。

鸿蒙版本openharmony-tpc/GSYVideoPlayer

如果克隆太慢或者图片看不到,可尝试从码云地址下载

类型功能
缓存边播边缓存,使用了AndroidVideoCache;Media3(ExoPlayer)使用SimpleCache。
协议h263\4\5、Https、concat、rtsp、hls、rtmp、crypto、mpeg等等。(ijk模式格式支持)
滤镜简单滤镜(马赛克、黑白、色彩过滤、高斯、模糊、模糊等等20多种)、动画、(水印、画面多重播放等)。
帧图视频第一帧、视频帧截图功能,视频生成gif功能。
播放列表播放、列表连续播放、重力旋转与手动旋转、视频本身rotation旋转属性、快播和慢播、网络视频加载速度。
画面调整显示比例:默认、16:9、4:3、填充;播放时旋转画面角度(0,90,180,270);镜像旋转。
内核IJKPlayer、Media3(EXOPlayer)、MediaPlayer、AliPlayer切换、自定义内核
布局全屏与非全屏两套布局切换、没有任何操作控件的纯播放支持、弹幕功能、继承自定义任何布局。
播放单例播放、多个同时播放、视频列表滑动自动播放、列表切换详情页面无缝播放。
窗口小窗口、多窗体下(包括桌面)的小窗口播放。
广告片头广告、跳过广告支持、中间插入广告功能。
字幕media3(exo2)模式下支持自定增加外挂字幕。
dashmedia3(exo2) 模式支持dash
stream支持元数据播放
适配 16kex_so 适配 16K Page Size
openssl目前 arm64 使用 openssl 1.1.1w
FFmpeg目前 arm64 使用 FFmpeg 4.1.6
FFmpeg目前 ex_so 的 arm64 支持 G711a(pcm_alaw)
更多暂停前后台切换不黑屏;调整不同清晰度的支持;无缝切换支持;锁定/解锁全屏点击功能;进度条小窗口预览(测试)。
自定义可自定义渲染层、自定义管理层、自定义播放层(控制层)、自定义缓存层。

Build Status Github Actions

GitHub stars GitHub forks GitHub issues GitHub license

公众号掘金知乎CSDN简书
GSYTech点我点我点我点我

--------------Demo APK 下载地址---------------

一、使用依赖

--- 版本更新说明 --- 。

1、Jitpack 引入方法(推荐, JCenter 即将关闭)

First、在project下的build.gradle添加

allprojects {
    repositories {
		...
        maven { url 'https://jitpack.io' }
        maven { url "https://maven.aliyun.com/repository/public" }
    }
}

你可以选择下面三种的其中一种,在module下的build.gradle添加。

A、直接引入

 //完整版引入
 implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer:v9.0.0-release-jitpack'


 //是否需要AliPlayer模式
 implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-aliplay:v9.0.0-release-jitpack'

B、添加java和你想要的so支持:

 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'

 //根据你的需求ijk模式的so
 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-arm64:v9.0.0-release-jitpack'
 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-armv7a:v9.0.0-release-jitpack'
 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-armv5:v9.0.0-release-jitpack'
 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-x86:v9.0.0-release-jitpack'
 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-x64:v9.0.0-release-jitpack'

C、支持其他格式协议的(mpeg,rtsp, concat、crypto协议,支持 16k Page Size)

A、B普通版本支持263/264/265等,对于mpeg编码会有声音无画面情况。 C 引入的so支持mpeg编码和其他补充协议,但是so包相对变大。

 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'

 //更多ijk的编码支持
 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v9.0.0-release-jitpack'

代码中的全局切换支持(更多请参看下方文档和demo)


//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;
    }
});

--- 更多依赖方式请点击 -

二、其他推荐

* 我所在的技术社区:掘金

* QQ群,有兴趣的欢迎(平时吹水吐槽多,因为人数饱和,就是日常瞎扯,没人解决问题的):174815284 。

* Flutter Github客户端 、React Native Github客户端 、 Weex Github客户端 、 原生 Kotlin Github客户端

* RxFFmpeg Android 的音视频编辑工具

* oarplayer Rtmp播放器,基于MediaCodec与srs-librtmp,不依赖ffmpeg

* 鸿蒙版本openharmony-tpc/GSYVideoPlayer

三、文档Wiki

文档传送门
使用说明--- 简单使用,快速上手文档
建议阅读--- 移动开发者必知的音视频基础知识1、--- 移动开发者必知的音视频基础知识2
项目解析说明--- 项目解析说明、包含项目架构和解析
接口文档入口--- 使用说明、接口文档 - 入口
问题集锦入口--- 问题集锦 - 入口(大部分你遇到的问题都在这里解决)
编码格式--- IJK so文件配置格式说明
编译自定义SO--- IJKPlayer编译自定义SO - 入口
版本更新说明--- 版本更新说明 - 入口
compileSdk 太高--- #3514

框架图

四、运行效果

  • 1、打开一个播放(旋转、镜像、填充)

  • 2、列表/详情模式(动画、旋转、小窗体)

  • 3、弹幕

  • 4、滤镜和GL动画

  • 6、背景铺满模糊播放

  • 7、进度条小窗口预览

五、近期版本

v9.0.0-release-jitpack (2024-07-29)

  • ex_so support 16k page size
  • update media3 1.4.0
  • fix #4014
  • fix #3999 & #3649 system mediaPlayer setSpeed cause play
  • fix #3972 ListGSYVideoPlayer 轮播场景焦点未移除导致播放器状态错误

v8.6.0-release-jitpack (2024-03-07)

  • update media 1.3.0
  • update exo source intercept listener
  • fix #3900

v8.5.0-release-jitpack (2023-11-20)

  • update media 1.2.0 & compileSdk 34
  • update exoplayer to androidx media
  • fix #3874
  • fix issues 3855 (#3856)
  • add #3843

更多版本请查阅:版本更新说明

六、关于Issues

提问题前可先查阅上方文档和说明,请在Demo中复现问题。

问题说明:

1、说明那个Demo中哪个页面。
2、问题显现和重现步骤。
3、补充问题的视频流url,截图。
4、补充问题的机型,android版本。

七、混淆

-keep class com.shuyu.gsyvideoplayer.video.** { *; }
-dontwarn com.shuyu.gsyvideoplayer.video.**
-keep class com.shuyu.gsyvideoplayer.video.base.** { *; }
-dontwarn com.shuyu.gsyvideoplayer.video.base.**
-keep class com.shuyu.gsyvideoplayer.utils.** { *; }
-dontwarn com.shuyu.gsyvideoplayer.utils.**
-keep class com.shuyu.gsyvideoplayer.player.** {*;}
-dontwarn com.shuyu.gsyvideoplayer.player.**
-keep class tv.danmaku.ijk.** { *; }
-dontwarn tv.danmaku.ijk.**
-keep class androidx.media3.** {*;}
-keep interface androidx.media3.**

-keep class com.shuyu.alipay.** {*;}
-keep interface com.shuyu.alipay.**

-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, java.lang.Boolean);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

如果是阿里云播放器,可以参考它的文档( https://help.aliyun.com/document_detail/124711.html?spm=a2c4g.124711.0.0.7fa0125dkwUPoU ),需要新增一些 keep 规则:

-keep class com.alivc.**{*;}
-keep class com.aliyun.**{*;}
-keep class com.cicada.**{*;}
-dontwarn com.alivc.**
-dontwarn com.aliyun.**
-dontwarn com.cicada.**

温馨提示

如果克隆太慢,可尝试从码云地址下载

关于自定义和出现问题的请先看问题集锦、demo、issue。

多了解一些音视频的基础常识,对容器,音视频编码,ffmpeg先做一些了解,以及mediacodec等的不同。
尽量少出现为什么别的能播的问题哟。

播放器的可自定义还是挺高的,定制请参考demo,多看源码。现在的功能有些多,demo也在不断的更新。

一些新功能和项目结构也在不断的调整。

欢迎提出问题,谢谢。

依赖大小参考

建议使用ndk过滤,详细参考 参考第四条 : 4、NDK的so支持

Star History Chart

Star History Chart

温馨提示

开源项目主要提供交流学习,并不提供技术支持,也不接商务合作,纯公益兴趣开源

License

请参看IJKPlayer和AndroidVideoCache相关协议。
项目最开始是从jiecao过来的,改着改着直接重构了。
偶尔有一变量和方法名可能还有点jiaozi的影子,但是基本是一个新项目。