Creați un vizualizator video Android Cardboard 360

Realitatea virtualizată și realitatea virtuală, deși relativ nouă, au devenit repede populare pentru aplicații, inclusiv pentru jocuri și educație. Anterior, v-am arătat cum să instalați Cardboard utilizând SDK-ul Android și cum să creați un vizualizator de imagini panoramice. Această postare vă va arăta cum să utilizați un videoclip de 360 ​​de grade în aplicațiile dvs..


Înființat

Înainte de a începe să vă construiți aplicația de vizualizare video, va trebui să clonați cartonul Android Cardboard pe computerul dvs. prin Git. Puteți găsi instrucțiuni pentru acest lucru în articolul precedent din această serie.

Pentru proba noastră, creați un nou proiect Android cu un SDK minim de API 19 (KitKat) și utilizați Activitate goală șablon.

Odată ce proiectul dvs. de bază este creat, va trebui să copiați comun, commonwidget și videowidget foldere din SDK de carton la rădăcina proiectului. Odată ce aceste directoare sunt mutate, va trebui să le includeți ca module în proiectul dvs. prin editarea dvs. settings.gradle fișier pentru a arăta ca fragmentul următor. 

include: "app", "common", "commonwidget", "videowidget"

În cele din urmă, includeți aceste și alte biblioteci necesare în proiect prin adăugarea următoarelor linii la dvs. aplicaţia ale modulului build.gradle fișier în dependențe nodul.

dependență compile 'com.android.support:appcompat-v7:25.0.0' compile proiect (': common') compile proiect (': commonwidget') compile proiect (': videowidget') compile 'com.google.android. exoplayer: exoplayer: r1.5.10 'compilați com.google.protobuf.nano: protobuf-javanano: 3.0.0-alpha-7'

Veți observa că am adăugat biblioteca Buffer Protocol de la Google, care vă ajută să gestionați resursele de rulare pe dispozitiv și ExoPlayer, care este o bibliotecă de playere video Google creată, că VrVideoView componentă este construită. Ambele biblioteci sunt necesare pentru SDK pentru a funcționa și este posibil să fi observat că versiunea ExoPlayer folosită este de la prima versiune și nu cea de-a doua, deci poate provoca conflicte dacă utilizați ExoPlayer v2 în proiectele proprii.

Apoi, vom dori să ne actualizăm activity_main.xml dosar pentru proiectul nostru de eșantion să includă o VrVideoView, A SeekBar, și a Buton cu care vom lucra mai târziu.

    

Odată ce ați terminat instalarea bibliotecilor de carton și ați creat aspectul pe care îl vom folosi, este timpul să sarăți în codul Java.

Lucrul cu carton și video VR

Înainte de a începe să scrieți tot codul care controlează starea redării, poziționarea și încărcarea în fișierul video 360, va trebui să determinăm sursa videoclipului nostru. Pentru acest tutorial vom crea un simplu bunuri dosarul din directorul principal și plasați acolo un videoclip 360. Deși există câteva surse pentru 360 de videoclipuri online, am inclus un scurt film video public de la Sea World care întoarce o broască țestoasă oceanului în proiectul GitHub însoțitor pentru acest tutorial. 

Inițializare și structură

Acum, când aveți un fișier video pe care îl puteți juca, deschideți-vă Activitate principala clasă.

Mai întâi trebuie să declarați și să inițializați Vedere elemente care sunt definite de fișierul de aspect, precum și două boolean valori pentru a urmări starea dezactivată și starea de redare / pauză. În plus, vom plasa un OnClickListener pe volumul nostru Buton obiect.

clasa publica MainActivity extinde AppCompatActivity privat VrVideoView mVrVideoView; privat SeekBar mSeekBar; butonul privat mVolumeButton; privat boolean mIsPaused; private boolean mIsMuted; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); initViews ();  void initViews privat () mVrVideoView = (VrVideoView) findViewById (R.id.video_view); mSeekBar = (SeekBar) findViewById (R.id.seek_bar); mVolumeButton = (buton) findViewById (R.id.btn_volume); mVolumeButton.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) onVolumeToggleClicked (););  public void playPause ()  public void peVolumeToggleClicked () 

Apoi, creați o nouă clasă interioară care se extinde VrVideoEventListener. Această clasă va avea cinci metode pe care le putem implementa pentru vizualizatorul nostru simplu de videoclipuri.

clasa privată ActivityEventListener extinde VrVideoEventListener @Override public void onLoadSuccess () super.onLoadSuccess ();  @Overide public void onLoadError (String errorMessage) super.onLoadError (errorMessage);  @Override public void onClick () super.onClick ();  @Override public void peNewFrame () super.onNewFrame ();  @Override publice void onCompletion () super.onCompletion (); 

De asemenea, va trebui să implementați SeekBar.OnSeekBarChangeListener din clasa ta și să creezi metodele pentru această interfață.

class public MainActivity extinde AppCompatActivity implementează SeekBar.OnSeekBarChangeListener ... public void onPlayPausePressed ()  public void onVolumeToggleClicked ()  @Overide public void peProgressChanged (SeekBar seekBar, int i, boolean b) 

Odată ce ați creat această nouă clasă interioară și SeekBar implementare, asociați-le cu dvs. VrVideoView și SeekBar, respectiv, la sfârșitul anului initViews () care a fost definită mai sus.

mVrVideoView.setEventListener (noua activitateEventListener ()); mSeekBar.setOnSeekBarChangeListener (aceasta);

Există încă o piesă de configurare care trebuie tratată. Veți avea nevoie să vă ocupați de ciclul de viață al activității Android, sprijinindu-l onPause (), onResume () și onDestroy () metodele de întrerupere sau reluare a redării în VrVideoView, sau să o închideți complet. De asemenea, va trebui să urmăriți starea de pauză în aceste metode.

@Override protejat void onPause () super.onPause (); mVrVideoView.pauseRendering (); mIsPaused = adevărat;  @Override protejate void onResume () super.onResume (); mVrVideoView.resumeRendering (); mIsPaused = false;  @Override protejate void onDestroy () mVrVideoView.shutdown (); super.onDestroy ();  

Acum, când configurația inițială a clasei noastre de instruire este finalizată, putem trece la un subiect mai interesant: încărcarea unui videoclip, controlul redării și personalizarea experienței utilizatorului.

Pornirea și controlul VrVideoView

Deoarece încărcarea unui videoclip 360 poate dura de la o fracțiune de secundă până la câteva secunde, veți dori să vă ocupați de încărcarea videoclipului printr-o activitate de fundal. Să începem prin crearea unui nou AsyncTask care va crea un nou VrVideoView.Options obiect, setați tipul de intrare pentru a corespunde formatării videoclipului nostru (în cazul acestui tutorial, TYPE_MONO), apoi încărcați videoclipul nostru din bunuri director.

clasa VideoLoaderTask extinde AsyncTask @Override protejat booleanul doInBackground (Void ... voids) try VrVideoView.Options options = VrVideoView.Options (); options.inputType = VrVideoView.Options.TYPE_MONO; mVrVideoView.loadVideoFromAsset ("seaturtle.mp4", opțiuni);  captură (IOException e) // Excepție mâner return true; 

Apoi, intrați în dvs. onCreate () și creați o nouă instanță a acestei sarcini, apoi apelați a executa() să o pornească. Deși există mai multe lucruri care ar trebui făcute pentru a menține în mod corespunzător această sarcină, vom folosi-o la nivel local în această metodă pentru simplitate și nu vă faceți griji despre AsyncTask considerente pe durata ciclului de viață.

VideoLoaderTask mBackgroundVideoLoaderTask = nou VideoLoaderTask (); mBackgroundVideoLoaderTask.execute ();

În acest moment, ar trebui să puteți rula aplicația dvs. și să vizionați redarea video 360 în vizualizarea video de carton. Acum că asta funcționează, să adăugăm ceva utilitate pentru utilizatorul nostru. Reveniți la ActivityEventListener obiect pe care l-ați creat mai devreme în acest tutorial, pentru că vom dori să dezbatem câteva dintre metode. Când videoclipul a fost încărcat cu succes, trebuie să setăm valoarea maximă pentru videoclipul nostru SeekBar, precum și să urmăriți starea de redare / pauză a videoclipului nostru.

@Override public void peLoadSuccess () super.onLoadSuccess (); mSeekBar.setMax ((int) mVrVideoView.getDurație ()); mIsPaused = false; 

Pe măsură ce redă videoclipul, vom actualiza acest lucru SeekBar prin onNewFrame (), și resetați videoclipul în poziția inițială din onCompletion (). În cele din urmă, în onClick (), vom declanșa metoda de redare / întrerupere a pauzei.

@Override public void peClick () playPause ();  @Override public void peNewFrame () super.onNewFrame (); mSeekBar.setProgress ((int) mVrVideoView.getCurrentPosition ());  @Override public void onCompletion () // Reporniți videoclipul, permițându-i să circule mVrVideoView.seekTo (0); 

În timp ce ne actualizăm SeekBar bazată pe redarea este importantă, vom dori, de asemenea, să permitem utilizatorului să schimbe locul în care se află în videoclip prin interacțiunea cu SeekBar. Putem face acest lucru folosind SeekBar.OnSeekBarChangeListener interfață pe care am implementat-o ​​mai devreme.

@Override public void peProgressChanged (SeekBar seekBar, int progress, boolean fromUser) if (fromUser) mVrVideoView.seekTo (progress); 

Pentru a ne încheia VrVideoView controale, va trebui să implementăm metodele de redare / pauză și de comutare a volumului.

void public playPause () dacă (mIsPaused) mVrVideoView.playVideo ();  altceva mVrVideoView.pauseVideo ();  mIsPaused =! mIsPaused;  void public peVolumeToggleClicked () mIsMuted =! mIsMuted; mVrVideoView.setVolume (mIsMuted? 0.0f: 1.0f); 

În acest moment, ar trebui să aveți în aplicația dvs. un player video complet 360 care să funcționeze și interactiv. 

Cu toate acestea, dacă rotiți dispozitivul, este posibil să observați reluarea completă a comportamentului nedorit al videoclipului. Putem rezolva acest lucru prin colaborarea cu Android onSaveInstanceState () și onRestoreInstanceState () pentru a salva și a reseta starea noastră VrVideoView.

static final static final STATE_PROGRESS = "state_progress"; statică finală privată statică STATE_DURATION = "stare_durare"; @Override protejat void onSaveInstanceState (Bundle outState) outState.putLong (STATE_PROGRESS, mVrVideoView.getCurrentPosition ()); outState.putLong (STATE_DURATION, mVrVideoView.getDuration ()); super.onSaveInstanceState (outState);  @Override protejate void onRestoreInstanceState (Bundle savedInstanceState) super.onRestoreInstanceState (savedInstanceState); progresul lung = savedInstanceState.getLong (STATE_PROGRESS); mVrVideoView.seekTo (progres); mSeekBar.setMax ((int) salvatInstanceState.getLong (STATE_DURATION)); mSeekBar.setProgress ((int) progres); 

Acum, când dispozitivul este rotit, videoclipul dvs. ar trebui să revină la poziția inițială, iar utilizatorul dvs. poate continua experiența lor neîntreruptă.

Concluzie

În timp ce există câteva detalii mici care trebuie rezolvate pentru a utiliza VrVideoView SDK Cardboard, părțile dificile, cum ar fi redarea și optimizarea efectivă, sunt tratate pentru dvs. de către o componentă ușor de implementat. 

Acum ar trebui să puteți adăuga 360 de videoclipuri în aplicațiile media, oferind utilizatorilor o caracteristică interesantă care le îmbogățește experiența. În următorul tutorial al acestei serii, ne vom concentra pe noua experiență VR a Google numită Daydream și cum să folosiți controlerul asociat cu aplicațiile.

În același timp, verificați câteva dintre celelalte tutoriale ale noastre privind realitatea virtuală Android și realitatea augmentată!

Cod