Android GSYVideoPlayer视频播放器功能的实现

GSYVideoPlayer

GSYVideoPlayer官方地址

GSYVideoPlayer 一个基于IJkPlayer的播放器
支持调节声音亮度
边播边缓存 使用了AndroidVideoCache;ExoPlayer使用SimpleCache
支持多种协议h263\4\5、Https、concat、rtsp、hls、rtmp、crypto、mpeg等等
简单滤镜(马赛克、黑白、色彩过滤、高斯、模糊、模糊等等20多种)、动画、(水印、画面多重播放等)
视频第一帧、视频帧截图功能,视频生成gif功能。
调整显示比例:默认、16:9、4:3、填充;播放时旋转画面角度(0,90,180,270);镜像旋转
IJKPlayer、EXOPlayer、MediaPlayer切换、自定义内核
小窗口、多窗体下(包括桌面)的小窗口播放。
片头广告、跳过广告支持、中间插入广告功能。
暂停前后台切换不黑屏;调整不同清晰度的支持;无缝切换支持;锁定/解锁全屏点击功能;进度条小窗口预览
可自定义渲染层、自定义管理层、自定义播放层(控制层)、自定义缓存层

使用依赖

1、JCenter 引入方法(推荐)
你可以选择下面三种的其中一种,在module下的build.gradle添加。

A、直接引入

//完整版引入
implementation 'com.shuyu:GSYVideoPlayer:8.1.2'

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

implementation 'com.shuyu:gsyVideoPlayer-java:8.1.2'

//是否需要ExoPlayer模式
implementation 'com.shuyu:GSYVideoPlayer-exo2:8.1.2'

//根据你的需求ijk模式的so
implementation 'com.shuyu:gsyVideoPlayer-armv5:8.1.2'
implementation 'com.shuyu:gsyVideoPlayer-armv7a:8.1.2'
implementation 'com.shuyu:gsyVideoPlayer-arm64:8.1.2'
implementation 'com.shuyu:gsyVideoPlayer-x64:8.1.2'
implementation 'com.shuyu:gsyVideoPlayer-x86:8.1.2'

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

implementation 'com.shuyu:gsyVideoPlayer-java:8.1.2'

//是否需要ExoPlayer模式
implementation 'com.shuyu:GSYVideoPlayer-exo2:8.1.2'

//更多ijk的编码支持
implementation 'com.shuyu:gsyVideoPlayer-ex_so:8.1.2'

代码中的全局切换支持

//EXOPlayer内核,支持格式更多
PlayerFactory.setPlayManager(Exo2PlayerManager.class);
//系统内核模式
PlayerFactory.setPlayManager(SystemPlayerManager.class);
//ijk内核,默认模式
PlayerFactory.setPlayManager(IjkPlayerManager.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;
  }
});

自定义一个播放器

public class LiveVideo extends StandardGSYVideoPlayer {
  public LiveDataFullscreenButtonClick liveDataClick;//点击全屏按钮回调

  /**
   * 恢复暂停状态
   */
  public void onResume() {
    onVideoResume();
  }
  /**
   * 暂停状态
   */
  public void onPause() {
    onVideoPause();
  }

  /**
   * 接口回调
   * @param liveDataClick
   */
  public void setOnFullscreenButtonClick(LiveDataFullscreenButtonClick liveDataClick) {
    this.liveDataClick = liveDataClick;
  }

  /* 重写方法自定义layout id与video_layout_standard.xml一致 不重新使用系统默认布局*/
  @Override
  public int getLayoutId() {
    return R.layout.test;
  }

  public LiveVideo(Context context, Boolean fullFlag) {
    super(context, fullFlag);
    init();
  }

  public LiveVideo(Context context) {
    super(context);
    init();
  }

  public LiveVideo(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  /* 初始化操作 */
  private void init() {
    //EXOPlayer内核,支持格式更多
//    PlayerFactory.setPlayManager(Exo2PlayerManager.class);
    //代理缓存模式,支持所有模式,不支持m3u8等,默认
//    CacheFactory.setCacheManager(ProxyCacheManager.class);
    //系统内核模式
//    PlayerFactory.setPlayManager(SystemPlayerManager.class);
    //ijk内核,默认模式
    PlayerFactory.setPlayManager(IjkPlayerManager.class);
    settingsVideo();
  }
  /* 一些播放器的设置 做一些UI的隐藏 可根据自己需求*/
  public void settingsVideo() {
    GSYVideoType.enableMediaCodec();//使能硬解码,播放前设置
    Debuger.enable();//打开GSY的Log
    //隐藏一些UI
    setViewShowState(mBottomContainer, VISIBLE);
    setViewShowState(mTopContainer, VISIBLE);
    setViewShowState(mLockScreen, GONE);
    setViewShowState(mLoadingProgressBar, GONE);
    setViewShowState(mTopContainer, GONE);
    setViewShowState(mThumbImageView, GONE);
    setViewShowState(mBottomProgressBar, GONE);
    //显示一些UI  进度 时间 当前时间 全屏 返回 加载Loading 暂停开始
    setViewShowState(mStartButton, VISIBLE);
    setViewShowState(mLoadingProgressBar, VISIBLE);
    setViewShowState(mFullscreenButton, VISIBLE);
    setViewShowState(mBackButton, GONE);
    setViewShowState(mProgressBar, VISIBLE);
    setViewShowState(mCurrentTimeTextView, VISIBLE);
    setViewShowState(mTotalTimeTextView, VISIBLE);
    setEnlargeImageRes(R.drawable.full);
    setShrinkImageRes(R.drawable.full);
  }

  //拦截事件
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    mFullscreenButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
        liveDataClick.onClick();
      }
    });
    return super.dispatchTouchEvent(ev);
  }

  /* 取消 双击暂停 */
  @Override
  protected void touchDoubleUp() {
//    super.touchDoubleUp();
  }

  public interface LiveDataFullscreenButtonClick {
    void onClick();
  }
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/black">
  <RelativeLayout
    android:id="@+id/surface_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
  </RelativeLayout>
  <RelativeLayout
    android:id="@+id/thumb"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:background="#000000"
    android:scaleType="fitCenter" />
  <LinearLayout
    android:id="@+id/layout_bottom"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_alignParentBottom="true"
    android:background="#99000000"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:visibility="invisible">
    <TextView
      android:id="@+id/current"
      android:textColor="@color/white"
      style="@style/news_des_style"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="16dp"
      android:text="00:00"
    />

    <SeekBar
      android:id="@+id/progress"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:layout_weight="1.0"
      android:background="@null"
      android:padding="10dp"
      android:max="100"
      android:maxHeight="4dp"
      android:minHeight="4dp"
      android:paddingBottom="8dp"
      android:paddingTop="8dp"
      android:progressDrawable="@drawable/video_progress_bg"
      android:thumb="@drawable/video_seek_thumb" />
    <TextView
      android:id="@+id/total"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginRight="16dp"
      android:text="00:00"
      android:textColor="@color/white"
      style="@style/news_des_style"/>
  </LinearLayout>
  <LinearLayout
    android:id="@+id/layout_top"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="@drawable/video_title_bg"
    android:gravity="center_vertical">
    <ImageView
      android:id="@+id/back"
      android:layout_width="48dp"
      android:layout_height="48dp"
      android:paddingLeft="10dp"
      android:scaleType="centerInside"
      android:src="@drawable/video_back" />
      <View
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent"/>
    <ImageView
      android:id="@+id/fullscreen"
      style="@style/left_icon_style"
      android:src="@drawable/full" />
  </LinearLayout>
  <ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/loading"
    android:layout_centerInParent="true"
    />
  <ImageView
    android:visibility="gone"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_centerInParent="true"
    android:padding="5dp"
    android:id="@+id/start"
   />
</RelativeLayout>

api

/**
   * 设置播放URL
   *
   * @param url      播放url
   * @param cacheWithPlay 是否边播边缓存
   * @param title     title
   * @return
   */
video.setUp("url", false, "");//设置播放路径
video.startPlayLogic();//开始播放


到此这篇关于Android GSYVideoPlayer视频播放器功能的实现的文章就介绍到这了,更多相关Android GSYVideoPlayer视频播放器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-03-30

Android多媒体之VideoView视频播放器

本文实例为大家分享了视频播放器的两种方式,供大家参考,具体内容如下 1).SurfaceView 在布局文件中 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/too

Android视频播放器屏幕左侧边随手指上下滑动亮度调节功能的原理实现

本文给大家分享Android视频播放器屏幕左侧边随手指上下滑动亮度调节功能的原理实现,具体代码如下所示: import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import andro

Android使用vitamio插件实现视频播放器

使用第三方的vitamio插件实现简易的播放器.vitamio版本(5.2.3) 官网地址:官网地址 效果展示 效果 项目结构 代码: MainActivity package com.example.www.app; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Li

android webvie指定视频播放器播放网站视频

过滤掉其他的播放器,使用我自己的播放器来做 复制代码 代码如下: wv.setWebViewClient(new WebViewClient() {            public boolean shouldOverrideUrlLoading(final WebView view,                    final String url) { if (url.contains("3gp") || url.contains("mp4")) {/

Android项目实现视频播放器

本文实例为大家分享了Android项目实现视频播放器的具体代码,供大家参考,具体内容如下 VideoView控件是播放视频用的,借助它可以完成一个简易的视频播放器. ①在activity_main.xml中编写相应的控件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro

Android基于IJKPlayer视频播放器简单封装设计

播放器的简单设计 播放器基于IJKPlayer来设计的, 播放器大致分三层 1.播放内核(基于ijkMediaplayer) 2.播放器View 3.播放器的MediaController 1.封装播放内核 我们都知道需要播放一个视频需要三个过程 1.create MediaPlayer 2.MediaPlayer prepare 3.MediaPlayer 与 Surface 绑定 xinvideoplayer中使用了VideoManager来控制ijkmediaplayer 所有的操作 三个

Android基于socket实现的简单C/S聊天通信功能

本文实例讲述了Android基于socket实现的简单C/S聊天通信功能.分享给大家供大家参考,具体如下: 主要想法:在客户端上发送一条信息,在后台开辟一个线程充当服务端,收到消息就立即回馈给客户端. 第一步:创建一个继续Activity的SocketClientActity类,包为com.pku.net 编写布局文件socketclient.xml,代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin

Android中网络框架简单封装的实例方法

Android中网络框架的简单封装 前言 Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能.访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库.由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架.如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做. 封装网络框架 在架构设计中,面向接口和抽象,

Android版音乐播放器

音乐播放器是一个非常常见的应用,这篇博客就是介绍如何制作一个简单的音乐播放器,这款音乐播放器具有以下的功能:播放歌曲.暂停播放歌曲..显示歌曲的总时长.显示歌曲的当前播放时长.调节滑块可以将歌曲调节到任何时间播放.退出音乐播放器. 实现效果如下 实现方式: 第一步:使用Android Studio创建一个Android工程,并且修改activity_main.xml文件 <?xml version="1.0" encoding="utf-8"?> <

iOS中视频播放器的简单封装详解

前言 如果仅仅是播放视频两者的使用都非常简单,但是相比MediaPlayer,AVPlayer对于视频播放的可控制性更强一些,可以通过自定义的一些控件来实现视频的播放暂停等等.因此这里使用AVPlayer的视频播放. 视频播放器布局 首先使用xib创建CLAVPlayerView继承UIView用来承载播放器,这样我们在外部使用的时候,直接在控制器View或者Cell上添加CLAVPlayerView即可,至于播放器播放或者暂停等操作交给CLAVPlayerView来管理.下面来看一下CLAVP

基于VideoView自定义控制面板的视频播放器

本文实例为大家分享了VideoView原生自定义视频播放器的具体代码,供大家参考,具体内容如下 项目用到的技术点和亮点 VideoView封装视频播放工具类 自定义视频控制面板 手势识别器的使用 1. VideoView封装视频播放工具类 视频播放这些其实都挺简单的,VideoView这个类都提供了相应方法,详细见代码 代码都比较简单,不过需要注意的是要在主线程中更新视频面板的UI信息. /*****************************************************

Android基于广播事件机制实现简单定时提醒功能代码

本文实例讲述了Android基于广播事件机制实现简单定时提醒功能代码.分享给大家供大家参考,具体如下: 1.Android广播事件机制 Android的广播事件处理类似于普通的事件处理.不同之处在于,后者是靠点击按钮这样的组件行为来触发,而前者是通过构建Intent对象,使用sentBroadcast()方法来发起一个系统级别的事件广播来传递信息.广播事件的接收是通过定义一个继承Broadcast Receiver的类实现的,继承该类后覆盖其onReceive()方法,在该方法中响应事件.And

防止未登录用户操作—基于struts2拦截器的简单实现

一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.我还记得很久以前我的做法:在某个jsp页面中查看session中是否有值(当然,在用户登录逻辑中会将用户名或者用户对象存入session中),如果session中用户信息为空,那么redirect 到登录页面.然后在除了登录页面外的其它所有需要验证用户已登录的页面引入这个jsp . 比如,我们将检查用户是否登录的代码放入一个jsp页面中,如 checkUser.jsp <%@