GVKun编程网logo

如何通过Google CardBoard Android SDK制作简单的VR视频播放器(谷歌vr视频播放器)

13

对于如何通过GoogleCardBoardAndroidSDK制作简单的VR视频播放器感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解谷歌vr视频播放器,并且为您提供关于AndroidGSY

对于如何通过Google CardBoard Android SDK制作简单的VR视频播放器感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解谷歌vr视频播放器,并且为您提供关于Android GSYVideoPlayer视频播放器功能的实现、android – / mnt / sdcard和/ sdcard之间有区别吗?、android – Google Drive SDK客户端ID、android – Google Glass GDK – 何时使用Activity vs Cards?的宝贵知识。

本文目录一览:

如何通过Google CardBoard Android SDK制作简单的VR视频播放器(谷歌vr视频播放器)

如何通过Google CardBoard Android SDK制作简单的VR视频播放器(谷歌vr视频播放器)

我遵循mog在帖子中的建议:

How to create VR Video player using Google Cardboard SDK for Unity

这是我的代码片段

1.
在MainActivity的onSurfaceCreated()方法中,我初始化一个纹理并将其绑定到GL,并创建一个曲面和与其关联的媒体播放器.

enter image description here

>在onNewFrame()方法中,我按照mog在帖子中所说的那样更新纹理

enter image description here

我将我的短视频保存为raw.mp4在原始文件夹中,但是,启动我的应用程序后,两边都是空白,而视频的声音实际上正在播放.

解决方法:

为了解决这个问题,我遇到了类似的问题,我使用了出色的RajawaliVR library.

我使用的代码:

    streamingTexture = new StreamingTexture("video", mediaPlayer);
    Material material = new Material();
    material.setColor(0);

    try {
        material.addTexture(texture);
    } catch (ATexture.TextureException e) {
        throw new RuntimeException(e);
    }

    Sphere sphere = new Sphere(50, 64, 32);
    sphere.setScaleX(-1);
    sphere.setMaterial(material);
    getCurrentScene().addChild(sphere);

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

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"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"/>
  </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"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 – / mnt / sdcard和/ sdcard之间有区别吗?

android – / mnt / sdcard和/ sdcard之间有区别吗?

我正在尝试将位图保存到Pictures目录中.这是代码

            File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

            File file = new File(path,"test1.PNG");
            try { 
                   path.mkdirs();
                   OutputStream out = new FileOutputStream(file);
                   mBitmap.compress(Bitmap.CompressFormat.PNG,90,out);
                   out.flush();
                   out.close();

            } catch (Exception e) {
                   e.printstacktrace();
                   Log.w("ExternalStorage","Error writing " + file,e);
            }

但是执行卡在OutputStream out = new FileOutputStream(file);
我用调试器和完整路径返回mnt / sdcard / Pictures / test1.PNG,是mnt /罪魁祸首为什么我无法通过OutputStream out = new FileOutputStream(file);?因为我只能在我的文件目录中看到sdcard /.

谢谢!

最佳答案
你可以使用这个Environment.getExternalStorageDirectory()作为mnt / sdcard或sdcard /它来获取和访问sdcard目录,这是一个设备依赖目录,它是操作系统访问和使用外部目录的方法,不需要担心不同的设备和不同的目录被返回通过这种方法.

编辑

对于访问外部存储需要权限并在androidmanifest.xml文件中定义为用户权限

WRITE_EXTERNAL_STORAGE

android – Google Drive SDK客户端ID

android – Google Drive SDK客户端ID

我按照Google Drive sdk的Quickstart Android指南创建了一个应用程序.当我在api控制台中设置项目时,我被赋予了客户端ID.但是我没有在任何地方使用这个客户端ID.客户端ID有什么用?我应该在我的应用程序中的某个地方使用它吗?

解决方法

在Android上,您的证书SHA1指纹和包名一起是您的应用程序的唯一标识符.只要这两个与您提供给API控制台的信息匹配,Drive API就会识别您的身份.您无需提供clientId.如果您不记得提供这两个信息,您应该为Android制作特殊的clientID,如图 here所示.

android – Google Glass GDK – 何时使用Activity vs Cards?

android – Google Glass GDK – 何时使用Activity vs Cards?

到目前为止,我一直只使用Mirror API.我已经开始浏览Google关于GDK的“Sneak Peek”版本的文档,以便我可以开始构建更复杂的应用程序.

现在我在这里遇到问题.我看到作为开发人员,我可以采用标准的Android方法并创建一个Activity,给它一个布局,在菜单上创建一些选项,并采用这种基本方法.

或者,它似乎有一个单独的API用于创建“卡片” – 静态,直播,沉浸.现在使用这种方法,可以使用TimelineManager类来显示这些卡片.我还可以使用CardScrollView和CardScrollAdapter在我的Glassware中创建自己的“时间轴”.它是否正确?为什么我会在这里使用另一个?

我想创建一个用户输入的应用程序,然后看到一个初始屏幕,他们可以点击向下钻取或滑动他们的手指以水平滚动到下一个屏幕(或卡而不是).所以在这里,我相信我会使用CardScrollAdapter和CardScrollView,确定用户点击Glass时用户所在的屏幕,然后启动一个新活动,在另一个CardScrollView / CardScrollAdapter或其他任何地方显示其他卡片 – 取决于任何这是我想做的 –

我只是想问我是否走在正确的轨道上,或者我的理解是完全错误的.

解决方法

看起来你刚刚开始阅读文档,所以我应首先回答概述,然后回答

1)Live Cards最初是Services,在低强度卡的情况下使用RemoteViews显示视图,在高强度卡的情况下使用SufaceHolder.

2)Static Cards纯粹基于GDK,并且几乎没有具体的功能.

3)Immersions最初是activities,您可以使用应用了Glass UI准则的所有Android SDK布局功能.

4)CardScrollView得到CardScrollAdapter最终必须添加到Activity.

.

所以答案是:

是的,你正走在必须以这种方式完成的正确道路上.

关于如何通过Google CardBoard Android SDK制作简单的VR视频播放器谷歌vr视频播放器的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android GSYVideoPlayer视频播放器功能的实现、android – / mnt / sdcard和/ sdcard之间有区别吗?、android – Google Drive SDK客户端ID、android – Google Glass GDK – 何时使用Activity vs Cards?的相关知识,请在本站寻找。

本文标签: