Android Studio如何建立VR视频

    xiaoxiao2021-03-25  131

     所需要的VR运行库可在https://github.com/googlevr/gvr-android-sdk/下载   新建项目后: 1. 在项目main文件夹下新建资产目录 assets并把视频放入该文件下: tips:文件夹命名必须是assets,否者会出现空指针错误。        2. 以module的形式导入VR项目依赖的library库,分别是必要的库common,commonwidge,和可选择的,例如  videowidgt(视频)。 3.快捷键(ctrl+shift+alt+s),实现module相关连 4.在项目里的build.gradle文件里添加: compile  'com.google.android.exoplayer:exoplayer:r1.5.10' compile  'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7       5.在AnroidManifest.xml文件下添加:  android :largeHeap= "true"  防止资源过大,出现out of memory错误。 6. 完成xml布局,VrPanoramaView。    7. 由于Vr资源量大,所以加载到子线程中进行主线程来显示图片。使用一个异步线程AsyncTask或EventBus技术进行 全部代码如下:  package com.zhiyuan3g.administrator.vr_video; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.google.vr.sdk.widgets.video.VrVideoEventListener; import com.google.vr.sdk.widgets.video.VrVideoView; import java.io.IOException; public class MainActivity  extends AppCompatActivity {     private VrVideoView  vrp;     private SeekBar  seekbar;     private TextView  tv;     private Myload  myload;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout. activity_main);         // 初始化         initView();     }     private void initView() {         vrp = (VrVideoView) findViewById(R.id. vr_video);         tv = (TextView) findViewById(R.id. tv_ar);         seekbar = (SeekBar) findViewById(R.id. seekbar);         // 隐藏 VR 信息按钮显示         vrp.setInfoButtonEnabled( false);         // 切换 VR 模式 参数: FULLSCREEN_STEREO  设备模式  FULLSCREEN_MONO 手机模式         vrp.setDisplayMode(VrVideoView.DisplayMode. FULLSCREEN_STEREO);         // 视频监听         vrp.setEventListener( new Mylisitener());         // 播放 VR 效果         myload new Myload();         myload.execute( "congo_2048.mp4");     }     //vr 资源数据量很大,获取需要时间,顾把加载时间放在子线程,主线程显示视频,可使用 AsyncTask Eventbar     private class Myload  extends AsyncTask<String, Void, Void> {         // 该方法在子线程中运行,从本地文件把资源加载到内存中         @Override         protected Void doInBackground(String... params) {             // 创建 VrVideoView.Options  对象,决定是普通效果还是立体效果             VrVideoView.Options options =  new VrVideoView.Options();             options. inputType = VrVideoView.Options. TYPE_STEREO_OVER_UNDER;             // 处理加载视频格式 //            FORMAT_DEFAULT 默认格式( sd 卡或 assets //            FORMAT_HLS 流媒体格式             options. inputFormat = VrVideoView.Options. FORMAT_DEFAULT;             // 提示:视屏加载还做了视频读取到内存中的操作,所以有一个矛盾             try {                 // 提示 : 视频加载的方法还做了把视频读取到内存中的操作 , 所以它会有一个矛盾 ,                 //  调用该方法是在主线程还是在子线程 ( 一般我们放在子线程去调用该方法 )                 vrp.loadVideoFromAsset(params[ 0], options);                 // 使用 vr 控件对象。从 assets 加载视频显示效果。参数 1 String 对象, 2VrVideoView.Options :显示效果            catch (IOException e) {                 e.printStackTrace();             }             return null;         }     }     // 优化方法     @Override     protected void onPause() {         // 暂停渲染和显示         vrp.pauseRendering();         super.onPause();     }     @Override     protected void onResume() {         // 继续渲染和显示         vrp.resumeRendering();         super.onResume();     }     //  Activity 销毁时,回调     @Override     protected void onDestroy() {         vrp.shutdown();         if ( myload !=  null) {             // 退出时,异步任务未取消             if (! myload.isCancelled()) {                 myload.cancel( true);             }         }         super.onDestroy();     }     // 自定义类对 vr 运行状态监听     private class Mylisitener  extends VrVideoEventListener {         //Vr 视频加载成功,回调         @Override         public void onLoadSuccess() {             // 获取视频长度             long duration =  vrp.getDuration();             // 设置 seekbar 进度最大值             seekbar.setMax(( int) duration);             super.onLoadSuccess();         }  // 视频加载失败回调         @Override         public void onLoadError(String errorMessage) {             Toast. makeText(MainActivity. this" 播放失败 ", Toast. LENGTH_LONG).show();             super.onLoadError(errorMessage);         }         // 当视频开始播放,每进入下一正,回调         @Override         public void onNewFrame() {             super.onNewFrame();             // 获取当前视频的播放时间位置             int currentPosition = ( intvrp.getCurrentPosition();             // 设置 seekBar 的进度条             seekbar.setProgress(currentPosition);             // 显示播放的进度数字             tv.setText( " 播放进度 :" + String. format( "%.2f", currentPosition /  1000.f) + String. format( "%.2f"vrp.getDuration() /  1000f));         }         @Override         public void onCompletion() {             // 视频回到 0             vrp.seekTo( 0);             // 视频停止             vrp.pauseVideo();             // 进度条回到原点             seekbar.setProgress( 0);             // 播放结束后,重新设置标签,暂停播放             ispause true;             super.onCompletion();         }         // 设置一个视频播放的标签         private boolean  ispause false;         // 重写点击视频方法         @Override         public void onClick() {             // 根据标签,判断   当前视频状态             if ( ispause) {                 vrp.playVideo();             }  else {                 vrp.pauseVideo();             }             super.onClick();             // 对标签操作一次后,要进行取反             ispause = ! ispause;         }     } }
    转载请注明原文地址: https://ju.6miu.com/read-13963.html

    最新回复(0)