實現VR視頻的播放和前面寫過的VR全景圖的展示差不多,改變的也只是庫文件的不同,資源目錄下的資源不同而已。下面就來說一下步驟。
先展示一下效果圖
完成步驟:
1.以導入的方式導入庫文件。(,,)資源獲取鏈接:
2.在main下新建資產目錄,放入視頻資源
3.在清單文件中提高警報權限:=”true”
4.在的 build.文件里中添加
‘com...::r1.5.10’
‘com...nano:-:3.0.0-alpha-7’
5.關聯導入的依賴庫
6完成xml中的布局,video.,,
7.使用異步任務,(或技術)加載視頻
8.利用線程進行VR優化。
9.設置VR的監聽效果
具體方法:
1.以導入的方式導入庫文件
2.添加資產目錄。在main新建目錄,將VR資源放入
3在清單文件下的添加 :=”true”的屬下節點
4.在的build.文件里中加入
‘com...::r1.5.10’
‘com...nano:-:3.0.0-alpha-7’
獲取方式:在你下載的VR資源文件路徑下(xxxx\gvr--sdk-\\sdk-)build.文件中拷取。
5.關聯你的庫文件:ctrl+alt+shift+s在打開的對話框中,選擇你原本的項目視頻播放器里的vr按鈕,選擇,點擊右上角”+”視頻播放器里的vr按鈕,選擇第三個 ,在打開的對話框中,選擇之前導入的庫文件。
6.xml中的代碼:
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zhiyuan3g.vrvideo.MainActivity">

<com.google.vr.sdk.widgets.video.VrVideoView
android:layout_width="match_parent"
android:layout_height="250dp"
android:id="@+id/vr_video">
com.google.vr.sdk.widgets.video.VrVideoView>
.support.v7.widget.AppCompatSeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/seek_bar"/>
"@+id/tv_progress"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
7、8,9步中所有的代碼都在這了
中的代碼:
這里寫代碼片import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.vr.sdk.widgets.common.VrWidgetView;
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 vr_video;
private SeekBar seek_bar;// 進度條

private TextView tv_progress;
private VideoLoadTask mVideoLoadTask;// 異步任務
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// A初始化控件
vr_video = (VrVideoView) findViewById(R.id.vr_video);
seek_bar = (SeekBar) findViewById(R.id.seek_bar);
tv_progress = (TextView) findViewById(R.id.tv_progress);
// 隱藏VR效果左下角信息按鈕顯示
vr_video.setInfoButtonEnabled(false);
// 切換VR模式 參數:VrVideoView.DisplayMode.FULLSCREEN_STEREO:設備模式(手機橫著放試試)
// VrVideoView.DisplayMode..FULLSCREEN_MONO手機模式
vr_video.setDisplayMode(VrVideoView.DisplayMode.FULLSCREEN_STEREO);
// 對VR視頻進行事件監聽
vr_video.setEventListener(new MyEventListener() );
// 播放VR效果,只需要執行異步任務即可
mVideoLoadTask = new VideoLoadTask();
mVideoLoadTask.execute("congo_2048.mp4");
}
// B 由于VR資源數據量很大,獲取需要時間,故把加載視頻放到子線程中進行,主線程來顯示,可以使用異步任務AsyncTask,或EventBus技術
// 自定義一個類繼承AsyncTask,只使用我們需要的方法,完成在子線程加載視頻資源,在主線程顯示
private class VideoLoadTask extends AsyncTask<String,Void,Void>{
// B該方法在子線程運行,從本地文件中把資源加載到內存中
@Override
protected Void doInBackground(String... params) {
// 創建VrVideoView.Options對象,決定VR是普通的效果,還是立體效果
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 {
//提示:視頻加載的方法還做了把視頻讀取到內存中的操作,所以它會有一個矛盾,調用該方法是在主線程還是在子線程(一般我們放在子線程去調用該方法)
// 使用VR控件對象,從資產目錄加載視頻數據,顯示效果, 參數1。params對象,2.VrVideoView.Options對象,決定顯示的效果
vr_video.loadVideoFromAsset(params[0],options);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
// C因為VR很占用內存,所以當界面進入OnPause狀態,暫停VR視圖顯示,
// 進入OnResume狀態,繼續VR視圖顯示,進入OnDestroy狀態,殺死VR
// 當我們失去焦點,回調
@Override
protected void onPause() {
super.onPause();
// 暫停渲染和顯示
vr_video.pauseRendering();
}
// 當獲取焦點時,回調
@Override
protected void onResume() {
super.onResume();
vr_video.resumeRendering();
}
// 當Activity銷毀時,回調
@Override
protected void onDestroy() {
super.onDestroy();

vr_video.shutdown();
// 在退出Activity時,如果異步任務沒有取消,則取消
if (mVideoLoadTask!=null){
if (!mVideoLoadTask.isCancelled()){
mVideoLoadTask.cancel(true);
}
}
}
// 對VR運行狀態監聽類,自定義一個類,繼承VrVideoEventListener,復寫里面需要的方法
private class MyEventListener extends VrVideoEventListener{
// 當VR視頻加載成功的時候回調 什么是回調:當你的程序到達符合某個條件時,
// 自動調用某段代碼或執行某個方法
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
// 獲取視頻長度
long max = vr_video.getDuration();
// 設置seekbar的進度最大值
seek_bar.setMax((int)max);
}
// 當VR視圖加載失敗的時候 回調
@Override
public void onLoadError(String errorMessage) {
super.onLoadError(errorMessage);
Toast.makeText(MainActivity.this, "播放失敗", Toast.LENGTH_SHORT).show();
}
// 當視頻開始播放,每次進入下一幀的時候,回調這個方法(就是播放時,會不停的回調該方法)
@Override
public void onNewFrame() {
super.onNewFrame();
// 獲取當前視頻的播放時間位置
int currentPosition = (int) vr_video.getCurrentPosition();
// 設置seekVar的進度條
seek_bar.setProgress(currentPosition);
// 顯示播放的進度數字

tv_progress.setText("播放進度:"+String.format("%.2f",currentPosition/1000.f)+String.format("%.2f",vr_video.getDuration()/1000f));
}
// 當視頻播放結束后的回到方法
@Override
public void onCompletion() {
super.onCompletion();
// 讓視頻回到0點
vr_video.seekTo(0);
// 讓視頻停止
vr_video.pauseVideo();
// 同時讓進度條回到0點
seek_bar.setProgress(0);
// 播放完成后,重新設置標簽true,暫停播放
isPaused = true;
}
// 設置一個視頻播放狀態的標簽
private boolean isPaused = false;
// 重寫點擊視圖的方法,使視頻被點擊時播放或者暫停
@Override
public void onClick() {
super.onClick();
Log.d("jzs","點擊");
// 根據標簽判斷當前視頻的狀態,標簽false,播放則暫停,標簽true,暫停播放
// true代表視頻正處于暫停狀態
if (isPaused){
// 視頻播放
vr_video.playVideo();
}else{// false代表視頻正在播放的狀態
vr_video.pauseVideo();
}
// 對標簽操做一次后,進行取反
isPaused = !isPaused;
}
}
}
共勉!!!!!