欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-06 14:56:14
gsyvideoplayergsyvideoplayer官方地址gsyvideoplayer 一个基于ijkplayer的播放器支持调节声音亮度边播边缓存 使用了androidvideocache;e...

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视频播放器功能的实现

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