La réalité augmentée et virtuelle, bien que relativement nouvelle, sont rapidement devenues populaires pour les applications, y compris pour les jeux et l’éducation. Auparavant, je vous ai montré comment installer Cardboard à l'aide du SDK Android et comment créer une visionneuse d'images panoramique. Cet article vous montrera comment utiliser la vidéo à 360 degrés dans vos applications..
Avant de commencer à créer votre application de visionneuse de vidéos, vous devez cloner le SDK Cardboard Android sur votre ordinateur via Git. Vous pouvez trouver des instructions à ce sujet dans l’article précédent de cette série..
Pour notre exemple, créez un nouveau projet Android avec un SDK minimum d’API 19 (KitKat) et utilisez le Activité vide modèle.
Une fois votre projet de base créé, vous devrez copier le commun, commonwidget et videowidget dossiers du carton SDK à la racine de votre projet. Une fois ces répertoires déplacés, vous devrez les inclure en tant que modules dans votre projet en modifiant votre paramètres.gradle fichier qui ressemble à l'extrait suivant.
include ': app', ": common", "commonwidget", "videowidget"
Enfin, incluez ces bibliothèques et d’autres nécessaires dans votre projet en ajoutant les lignes suivantes à votre app modules build.gradle déposer sous le les dépendances nœud.
dependencies compile 'com.android.support:appcompat-v7:25.0.0' compile projet (': common') compile projet (': commonwidget') compile projet (': videowidget') compile 'com.google.android. exoplayer: exoplayer: r1.5.10 'compiler' com.google.protobuf.nano: protobuf-javanano: 3.0.0-alpha-7 '
Vous remarquerez que nous avons ajouté la bibliothèque Protocol Buffers de Google, qui facilite la gestion des ressources d’exécution sur le périphérique, et ExoPlayer, une bibliothèque de lecteur vidéo créée par Google. VrVideoView
composant est construit sur. Cardboard SDK est nécessaire pour que ces deux bibliothèques fonctionnent, et vous avez peut-être remarqué que la version d'ExoPlayer utilisée est celle de la première version, et non de la deuxième. Elle peut donc générer des conflits si vous utilisez ExoPlayer v2 dans vos propres projets..
Ensuite, nous voudrons mettre à jour notre activity_main.xml fichier pour notre exemple de projet pour inclure un VrVideoView
, une Barre de recherche
, et un Bouton
que nous travaillerons plus tard.
Une fois que vous avez fini de configurer les bibliothèques Cardboard et que vous avez créé la disposition que nous allons utiliser, il est temps de passer au code Java..
Avant de pouvoir commencer à écrire tout le code qui contrôle l’état de la lecture, la position et le chargement dans votre fichier vidéo 360, nous devons déterminer la source de notre vidéo. Pour ce tutoriel, nous allons simplement créer un les atouts dossier sous le répertoire principal et placez une vidéo 360 à cet endroit. Bien qu'il existe quelques sources pour 360 vidéos en ligne, j'ai inclus une courte vidéo du domaine public de Sea World rapportant une tortue de mer à l'océan dans le projet GitHub qui l'accompagne pour ce tutoriel..
Maintenant que vous avez un fichier vidéo à jouer, ouvrez votre Activité principale
classe.
Vous devez d’abord déclarer et initialiser le Vue
éléments définis par le fichier de mise en page, ainsi que deux booléen
valeurs pour garder la trace de l’état muet et de la lecture / pause. De plus, nous placerons un OnClickListener
sur notre volume Bouton
objet.
Classe publique MainActivity étend AppCompatActivity private VrVideoView mVrVideoView; SeekBar privée mSeekBar; Bouton privé mVolumeButton; privé booléen mIsPaused; privé booléen mIsMuted; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); initViews (); private void initViews () mVrVideoView = (VrVideoView) findViewById (R.id.video_view); mSeekBar = (SeekBar) findViewById (R.id.seek_bar); mVolumeButton = (Button) findViewById (R.id.btn_volume); mVolumeButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (Affichage de la vue) onVolumeToggleClicked ();); public void playPause () public void onVolumeToggleClicked ()
Ensuite, créez une nouvelle classe interne qui s'étend VrVideoEventListener
. Cette classe aura cinq méthodes que nous pouvons implémenter pour notre visualiseur vidéo simple.
La classe privée ActivityEventListener étend VrVideoEventListener @Override public void onLoadSuccess () super.onLoadSuccess (); @Override public void onLoadError (String errorMessage) super.onLoadError (errorMessage); @Override public void onClick () super.onClick (); @Override public void onNewFrame () super.onNewFrame (); @Override public void onCompletion () super.onCompletion ();
Vous devrez également mettre en œuvre SeekBar.OnSeekBarChangeListener
dans votre classe et créer les talons de méthode pour cette interface.
public class MainActivity étend AppCompatActivity implémente SeekBar.OnSeekBarChangeListener … public void onPlayPausePressed () public void onVolumeToggleClicked () @Override public void onProgressChanged (SeekBar seekB, i
Une fois que vous avez créé cette nouvelle classe interne et Barre de recherche
mise en œuvre, associez-les à votre VrVideoView
et Barre de recherche
, respectivement, à la fin de la initViews ()
méthode qui a été définie ci-dessus.
mVrVideoView.setEventListener (new ActivityEventListener ()); mSeekBar.setOnSeekBarChangeListener (this);
Il y a encore un élément de configuration à prendre en compte. Vous devrez gérer le cycle de vie de l'activité Android en prenant en charge le onPause ()
, pour résumer()
et onDestroy ()
méthodes pour mettre en pause ou reprendre le rendu dans le VrVideoView
, ou de le fermer complètement. Vous devrez également garder trace de l'état de pause dans ces méthodes.
@Override protected void onPause () super.onPause (); mVrVideoView.pauseRendering (); mIsPaused = true; @Override protected void onResume () super.onResume (); mVrVideoView.resumeRendering (); mIsPaused = false; @Override protected void onDestroy () mVrVideoView.shutdown (); super.onDestroy ();
Maintenant que la configuration initiale de notre classe de tutoriel est terminée, nous pouvons passer au sujet plus intéressant: charger une vidéo, contrôler la lecture et personnaliser l'expérience utilisateur..
VrVideoView
Étant donné que le chargement d'une vidéo 360 peut durer d'une fraction de seconde à plusieurs secondes, vous devrez gérer le chargement de votre vidéo via une tâche en arrière-plan. Commençons par créer un nouveau AsyncTask
cela va créer un nouveau VrVideoView.Options
objet, définissez le type d'entrée pour qu'il corresponde au formatage de notre vidéo (dans le cas de ce tutoriel), TYPE_MONO
), puis chargez notre vidéo à partir du les atouts annuaire.
la classe VideoLoaderTask étend AsyncTask@Override protected Boolean doInBackground (Void… voids) try VrVideoView.Options options = new VrVideoView.Options (); options.inputType = VrVideoView.Options.TYPE_MONO; mVrVideoView.loadVideoFromAsset ("seaturtle.mp4", options); catch (IOException e) // Une exception de traitement return true;
Ensuite, allez dans votre onCreate ()
méthode et créer une nouvelle instance de cette tâche, puis appeler exécuter()
pour le démarrer. Bien qu'il reste encore beaucoup à faire pour maintenir correctement cette tâche, nous l'utilisons simplement localement dans cette méthode pour plus de simplicité et sans souci. AsyncTask
considérations relatives au cycle de vie.
VideoLoaderTask mBackgroundVideoLoaderTask = new VideoLoaderTask (); mBackgroundVideoLoaderTask.execute ();
À ce stade, vous devriez pouvoir exécuter votre application et regarder la lecture de la vidéo à 360 ° dans la vue vidéo en carton. Maintenant que cela fonctionne, ajoutons un utilitaire pour notre utilisateur. Retour à la ActivityEventListener
objet que vous avez créé précédemment dans ce didacticiel, car nous voudrions en préciser certaines des méthodes. Lorsque la vidéo a été chargée avec succès, nous devons définir la valeur maximale pour notre Barre de recherche
, ainsi que de suivre l'état de lecture / pause de notre vidéo.
@Override public void onLoadSuccess () super.onLoadSuccess (); mSeekBar.setMax ((int) mVrVideoView.getDuration ()); mIsPaused = false;
Pendant la lecture de la vidéo, nous mettrons à jour cette Barre de recherche
à travers onNewFrame ()
, et réinitialiser la vidéo à la position initiale en complément()
. Enfin, dans sur clic()
, nous allons déclencher notre méthode de lecture / pause.
@Override public void onClick () playPause (); @Override public void onNewFrame () super.onNewFrame (); mSeekBar.setProgress ((int) mVrVideoView.getCurrentPosition ()); @Override public void onCompletion () // Redémarre la vidéo, lui permettant de mettre en boucle mVrVideoView.seekTo (0);
En mettant à jour notre Barre de recherche
basé sur la lecture est important, nous voudrons également permettre à l'utilisateur de changer où il se trouve dans la vidéo en interagissant avec le Barre de recherche
. Nous pouvons le faire en utilisant le SeekBar.OnSeekBarChangeListener
interface que nous avons mis en place plus tôt.
@Override public nul onProgressChanged (SeekBar seekBar, int progress, booléen fromUser) if (fromUser) mVrVideoView.seekTo (progress);
Pour compléter notre VrVideoView
contrôles, nous devrons mettre en œuvre les méthodes play / pause et bascule du volume.
public void playPause () if (mIsPaused) mVrVideoView.playVideo (); else mVrVideoView.pauseVideo (); mIsPaused =! mIsPaused; public void onVolumeToggleClicked () mIsMuted =! mIsMuted; mVrVideoView.setVolume (mIsMuted? 0.0f: 1.0f);
À ce stade, vous devez disposer d’un lecteur vidéo 360 entièrement fonctionnel et interactif dans votre application..
Toutefois, si vous faites pivoter votre appareil, vous remarquerez peut-être le comportement indésirable de la vidéo qui redémarre complètement. Nous pouvons résoudre ce problème en travaillant avec Android onSaveInstanceState ()
et onRestoreInstanceState ()
pour sauvegarder et réinitialiser l'état de notre VrVideoView
.
private static final String STATE_PROGRESS = "state_progress"; private static final String STATE_DURATION = "state_duration"; @Override protected void onSaveInstanceState (Bundle outState) outState.putLong (STATE_PROGRESS, mVrVideoView.getCurrentPosition ()); outState.putLong (STATE_DURATION, mVrVideoView.getDuration ()); super.onSaveInstanceState (outState); @Override protected void onRestoreInstanceState (Ensemble, savedInstanceState) super.onRestoreInstanceState (savedInstanceState); long progress = savedInstanceState.getLong (STATE_PROGRESS); mVrVideoView.seekTo (progrès); mSeekBar.setMax ((int) savedInstanceState.getLong (STATE_DURATION)); mSeekBar.setProgress ((int) progress);
Désormais, lorsque le périphérique est pivoté, votre vidéo doit revenir à sa position d'origine et votre utilisateur peut continuer à vivre l'expérience ininterrompue..
VrVideoView de Cardboard SDK nécessite quelques petits détails, mais les parties difficiles, telles que la lecture et l'optimisation, sont gérées pour vous par un composant facile à implémenter.
Vous devriez maintenant pouvoir ajouter 360 vidéos à vos applications multimédias, offrant ainsi à vos utilisateurs une fonctionnalité intéressante qui enrichit leur expérience. Dans le prochain didacticiel de cette série, nous nous concentrerons sur la nouvelle expérience de Google en matière de RV, appelée Daydream, et sur l'utilisation du contrôleur apparié avec vos applications..
En attendant, consultez certains de nos autres tutoriels sur la réalité virtuelle Android et la réalité augmentée!