Fermer

avril 19, 2018

Un tutoriel approfondi


React Native est une technologie jeune qui gagne déjà en popularité auprès des développeurs. C'est une excellente option pour un développement d'applications mobiles fluide, rapide et efficace. Taux élevés de performances pour les environnements mobiles, réutilisation du code et communauté forte: voici quelques-uns des avantages offerts par React Native.

Dans ce guide, je partagerai quelques réflexions sur les capacités de haut niveau de React Native et de Nous allons développer le processus pas-à-pas de la création d'une application d'enregistrement vidéo / audio avec React Native et Expo . Expo est une chaîne d'outils open-source construite autour de React Native pour développer des projets iOS et Android avec React et JavaScript. Il fournit un tas d'API natives maintenues par les développeurs natifs et la communauté open-source.

Après avoir lu cet article, vous devriez avoir toutes les connaissances nécessaires pour créer une fonctionnalité d'enregistrement vidéo / audio avec React Native.

L'application que vous apprendrez à développer s'appelle un cahier multimédia. J'ai mis en place une partie de cette fonctionnalité dans une application de jobboard en ligne pour l'industrie cinématographique. L'objectif principal de cette application mobile est de connecter les gens qui travaillent dans l'industrie du film avec les employeurs. Ils peuvent créer un profil, ajouter une introduction vidéo ou audio, et postuler à des emplois.

L'application se compose de trois écrans principaux que vous pouvez basculer entre les deux à l'aide d'un onglet:

téléphone portable. Il y a deux options pour ouvrir le projet:

  1. Ouvrez le lien dans le navigateur, scannez le code QR avec votre téléphone mobile, et attendez que le projet se charge
  2. Ouvrez le lien avec votre téléphone mobile et cliquez sur " Ouvrez le projet en utilisant Expo ".

Vous pouvez également ouvrir l'application dans le navigateur. Cliquez sur "Ouvrir le projet dans le navigateur". Si vous avez un compte payant sur Appetize.io visitez-le et entrez le code dans le champ pour ouvrir le projet. Si vous n'avez pas de compte, cliquez sur "Ouvrir le projet" et attendez dans une file d'attente au niveau du compte pour ouvrir le projet.

Cependant, je vous recommande de télécharger l'application Expo et d'ouvrir ce projet sur votre téléphone mobile. Découvrez toutes les fonctionnalités de l'application d'enregistrement vidéo et audio

Vous pouvez trouver le code complet de l'application d'enregistrement multimédia dans le référentiel sur GitHub.

Dépendances utilisées pour l'application Développement

Comme mentionné précédemment, l'application d'enregistrement multimédia est développée avec React Native et Expo.

Vous pouvez voir la liste complète des dépendances dans le fichier package.json du référentiel. bibliothèques principales utilisées:

  • React-navigation, pour naviguer dans l'application,
  • Redux, pour sauvegarder l'état de l'application,
  • React-redux, qui sont des liaisons React pour Redux,
  • Recomposer, pour écrire les composants 'logic,
  • Reselect, pour extraire les fragments d'état de Redux. [1] 9659023] Regardons la structure du projet:

    Grand aperçu
    • src / index.js : composant de l'application racine importé dans le fichier app.js ;
    • src / components : composants réutilisables;
    • src / constantes : constantes globales;
    • src / styles : styles globaux, couleurs, tailles et dimensions des polices. [19659010] src / utils : utilitaires utiles et recomposer des enhancers;
    • src / screens : composants d'écrans;
    • src / store : Redux store; [19659010] src / navigation : navigateur de l'application;
    • src / modules : modules Redux divisés par entités comme modules / audio, modules / vidéo, modules / navigation. passez à la partie pratique

      Créer une fonctionnalité d'enregistrement audio avec React Native

      Tout d'abord, il est important de vérifier la documentation pour l'API Audio Expo [1945900] 4]lié à l'enregistrement et à la lecture audio. Vous pouvez voir tout le code dans le référentiel . Je recommande d'ouvrir le code en lisant cet article pour mieux comprendre le processus.

      Lorsque vous lancez l'application pour la première fois, vous avez besoin de l'autorisation de l'utilisateur pour l'enregistrement audio, ce qui implique l'accès au microphone. Utilisons Expo.AppLoading et demandons l'autorisation d'enregistrement en utilisant Expo.Permissions (voir src / index.js ) pendant startAsync

      Attendre Permissions.askAsync (Permissions.AUDIO_RECORDING);

      Les enregistrements audio sont affichés sur un écran séparé dont l'interface utilisateur change en fonction de l'état.

      D'abord, vous pouvez voir le bouton "Démarrer l'enregistrement". Après avoir cliqué sur, l'enregistrement audio commence, et vous trouverez la durée audio actuelle sur l'écran. Après l'arrêt de l'enregistrement, vous devrez taper le nom de l'enregistrement et enregistrer l'audio dans le magasin Redux

      Mon interface d'enregistrement audio ressemble à ceci:

      Grand aperçu

      Je peux enregistrer l'audio dans le magasin Redux au format suivant:

       audioItemsIds: [‘id1’, ‘id2’],
      audioItems: {
       'Id1': {
          id: chaîne,
          titre: chaîne,
          recordDate: chaîne de date,
          durée: nombre,
          audioUrl: chaîne,
       }
      }, 

      Écrivons la logique audio en utilisant Recompose dans le conteneur de l'écran src / screens / RecordAudioScreenContainer .

      Avant de commencer l'enregistrement, personnalisez le mode audio avec l'aide de Expo. Audio.set.AudioModeAsync (mode), où mode est le dictionnaire avec les paires valeur-clé suivantes :

      • playsInSilentModeIOS : Un booléen sélectionnant si l'audio de votre expérience doit jouer en mode silencieux sur iOS. Cette valeur par défaut est false
      • permetRecordingIOS : Un booléen sélectionne si l'enregistrement est activé sur iOS. Cette valeur par défaut est false. Remarque: Lorsque ce drapeau est défini sur true, la lecture peut être acheminée vers le récepteur du téléphone, et non vers le haut-parleur.
      • interruptionModeIOS : Enum sélectionnant comment l'audio de votre expérience doit interagir avec l'audio des autres apps sur iOS.
      • shouldDuckAndroid : Un booléen sélectionnant si l'audio de votre expérience devrait être automatiquement réduit en volume ("canard") si l'audio d'une autre application interrompt votre expérience. Cette valeur par défaut est true. Si faux, le son provenant d'autres applications mettra votre audio en pause
      • interruptionModeAndroid : Enum sélectionnant comment l'audio de votre expérience devrait interagir avec l'audio d'autres applications sur Android.

      Note ]: Vous pouvez en savoir plus sur la personnalisation de AudioMode dans la documentation .

      J'ai utilisé les valeurs suivantes dans cette application:

      interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX – Notre enregistrement interrompt l'audio d'autres applications sur IOS.

      playsInSilentModeIOS : true

      shouldDuckAndroid ]: true

      interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX – Notre enregistrement interrompt le son d'autres applications sur Android.

      permetRecordingIOS Deviendra true avant l'enregistrement audio et à False after its completion.

      Pour implémenter ceci, écrivons le gestionnaire setAudioMode avec Recompose .

       withHandlers ({
       setAudioMode: () => async ({permetRecordingIOS}) => {
         essayez {
           wait Audio.setAudioModeAsync ({
             permetRecordingIOS,
             interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
             playsInSilentModeIOS: true,
             shouldDuckAndroid: vrai,
             interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
           });
         } catch (erreur) {
           console.log (erreur) // eslint-disable-line
         }
       },
      }), 

      Pour enregistrer l'audio, vous devez créer une instance de la classe Expo.Audio.Recording .

       const recording = new Audio.Recording (); 

      Après avoir créé l'instance d'enregistrement, vous pourrez recevoir le statut de l'enregistrement avec l'aide de recordingInstance.getStatusAsync () .

      Le statut de l'enregistrement est un dictionnaire avec les paires clé-valeur suivantes:

      • canRecord: un booléen
      • isRecording: un booléen décrivant si l'enregistrement est en cours d'enregistrement.
      • isDoneRecording : un booléen
      • durationMillis: durée actuelle de l'enregistrement audio.

      Vous pouvez également définir une fonction à appeler à intervalles réguliers avec recordingInstance.setOnRecordingStatusUpdate (onRecordingStatusUpdate)

      Pour mettre à jour l'interface utilisateur, vous devrez appeler setOnRecord ingStatusUpdate et définissez votre propre callback.

      Ajoutons quelques accessoires et un callback d'enregistrement au conteneur.

       withStateHandlers ({
          enregistrement: nul,
          isRecording: faux,
          durationMillis: 0,
          isDoneRecording: false,
          fileUrl: null,
          audioName: '',
        }, {
          setState: () => obj => obj,
          setAudioName: () => audioName => ({nom audio}),
         recordingCallback: () => ({durationMillis, isRecording, isDoneRecording}) =>
            ({durationMillis, isRecording, isDoneRecording}),
        }), 

      Le paramètre de rappel pour setOnRecordingStatusUpdate est:

      recording.setOnRecordingStatusUpdate (props.recordingCallback);

      onRecordingStatusUpdate est appelé chaque 500 millisecondes par défaut. Pour rendre la mise à jour de l'interface utilisateur valide, définissez l'intervalle de 200 millisecondes à l'aide de setProgressUpdateInterval :

      recording.setProgressUpdateInterval (200);

      Après avoir créé une instance de cette classe , appelez prepareToRecordAsync pour enregistrer l'audio.

      recordingInstance.prepareToRecordAsync (options) charge l'enregistreur en mémoire et le prépare pour l'enregistrement. Il doit être appelé avant d'appeler startAsync () . Cette méthode peut être utilisée si l'instance d'enregistrement n'a jamais été préparée

      Les paramètres de cette méthode incluent des options d'enregistrement comme fréquence d'échantillonnage, débit, canaux, format, encodeur et extension. Vous pouvez trouver une liste de toutes les options d'enregistrement dans ce document .

      Dans ce cas, utilisons Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY .

      Une fois l'enregistrement préparé, vous pouvez commencez l'enregistrement en appelant la méthode recordingInstance.startAsync () .

      Avant de créer une nouvelle instance d'enregistrement vérifiez si elle a déjà été créée. Le gestionnaire pour commencer l'enregistrement ressemble à ceci:

       onStartRecording: props => async () => {
            essayez {
              if (props.recording) {
                props.recording.setOnRecordingStatusUpdate (null);
                props.setState ({enregistrement: null});
              }
      
              wait props.setAudioMode ({permetRecordingIOS: true});
      
              const enregistrement = new Audio.Recording ();
              recording.setOnRecordingStatusUpdate (props.recordingCallback);
              recording.setProgressUpdateInterval (200);
      
              props.setState ({fileUrl: null});
      
      attendre recording.prepareToRecordAsync (Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY);
              attendre recording.startAsync ();
      
              props.setState ({enregistrement});
            } catch (erreur) {
              console.log (erreur) // eslint-disable-line
            }
          }, 

      Vous devez maintenant écrire un gestionnaire pour la fin de l'enregistrement audio. Après avoir cliqué sur le bouton stop, vous devez arrêter l'enregistrement, le désactiver sur iOS, recevoir et enregistrer l'URL locale de l'enregistrement, et définir OnRecordingStatusUpdate et l'instance d'enregistrement sur null :

       onEndRecording: props => async () => {
            essayez {
              attendez props.recording.stopAndUnloadAsync ();
              wait props.setAudioMode ({permetRecordingIOS: false});
            } catch (erreur) {
              console.log (erreur); // eslint-disable-line
            }
      
            if (props.recording) {
              const fileUrl = props.recording.getURI ();
              props.recording.setOnRecordingStatusUpdate (null);
              props.setState ({recording: null, fileUrl});
            }
          }, 

      Après cela, tapez le nom audio, cliquez sur le bouton "continuer" et la note audio sera enregistrée dans le magasin Redux . => () => {
            if (props.audioName && props.fileUrl) {
              const audioItem = {
                id: uuid (),
                recordDate: moment (). format (),
                titre: props.audioName,
                audioUrl: props.fileUrl,
                durée: props.durationMillis,
              }

              props.addAudio (audioItem);
              props.setState ({
                audioName: '',
                isDoneRecording: false,
              });

              props.navigation.navigate (screens.LibraryTab);
            }
          },

      ( Grand aperçu )

      Lecture audio avec React Native

      Vous pouvez lire l'audio sur l'écran avec les notes audio enregistrées. Pour démarrer la lecture audio, cliquez sur l'un des éléments de la liste. Ci-dessous, vous pouvez voir le lecteur audio qui vous permet de suivre la position actuelle de lecture, de définir le point de départ de la lecture et de basculer l'audio en cours de lecture

      Voici à quoi ressemble l'interface de lecture audio:

      19659044] Les objets Expo.Audio.Sound et Expo.Video partagent une API impérative unifiée pour la lecture de média.

      Écrivons la logique de la lecture audio en utilisant Recomposer dans le conteneur d'écran src / screens / LibraryScreen / LibraryScreenContainer car le lecteur audio est disponible uniquement sur cet écran.

      Si vous voulez afficher le lecteur à n'importe quel point de l'application, je recommande d'écrire la logique du lecteur et la lecture audio dans Opérations de Redux utilisant redux-thunk .

      Personnalisons le mode audio de la même manière que nous l'avons fait pour l'enregistrement audio. D'abord, réglez permetRecordingIOS à false .

       lifecycle ({
          async componentDidMount () {
            wait Audio.setAudioModeAsync ({
              permetRecordingIOS: false,
              interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
              playsInSilentModeIOS: true,
              shouldDuckAndroid: vrai,
              interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
            });
          },
        }), 

      Nous avons créé l'instance d'enregistrement pour l'enregistrement audio. En ce qui concerne la lecture audio, nous devons créer l'instance sonore . Nous pouvons le faire de deux manières différentes:

      1. const playbackObject = nouveau Expo.Audio.Sound ();
      2. Expo.Audio.Sound.create (source, initialStatus = {} , onPlaybackStatusUpdate = null, downloadFirst = true)

      Si vous utilisez la première méthode, vous devrez appeler playbackObject.loadAsync () qui charge le média de la source dans la mémoire et le prépare pour jouer, après la création de l'instance.

      La seconde méthode est une méthode de commodité statique pour construire et charger un son. Il crée et charge un son à partir de la source avec les paramètres initialStatus onPlaybackStatusUpdate et downloadFirst facultatifs

      Le paramètre source est la source du son. Il prend en charge les formes suivantes:

      • un dictionnaire de la forme {uri: 'http: // chemin / vers / fichier'} avec une URL de réseau pointant vers un fichier audio sur le web; [19659010] require ('path / to / file') pour un asset de fichier audio dans le répertoire de code source
      • un objet Expo.Asset pour un asset de fichier audio. ] Le paramètre initialStatus est l'état de lecture initial. PlaybackStatus est la structure renvoyée par tous les appels d'API de lecture décrivant l'état de playbackObject à ce moment. C'est un dictionnaire avec les paires clé-valeur. Vous pouvez vérifier toutes les clés du PlaybackStatus dans la documentation

        onPlaybackStatusUpdate est une fonction prenant un seul paramètre, PlaybackStatus ] Il est appelé à intervalles réguliers pendant que le média est à l'état chargé. L'intervalle est de 500 millisecondes par défaut. Dans mon application, je l'ai défini à intervalle de 50 millisecondes pour une mise à jour de l'interface utilisateur appropriée.

        Avant de créer l'instance de son, vous devrez implémenter le rappel onPlaybackStatusUpdate . Tout d'abord, ajoutez des accessoires au conteneur d'écran:

         withClassVariableHandlers ({
            playbackInstance: null,
            isSeeking: faux,
            shouldPlayAtEndOfSeek: false,
            playingAudio: null,
          }, 'setClassVariable'),
          withStateHandlers ({
            position: null,
            durée: null,
            shouldPlay: false,
            isLoading: vrai,
            isPlaying: faux,
            isBuffering: faux,
            showPlayer: false,
          }, {
            setState: () => obj => obj,
          }), 

        Maintenant, implémentez onPlaybackStatusUpdate . Vous aurez besoin de faire plusieurs validations basées sur PlaybackStatus pour un affichage correct de l'interface utilisateur:

         withHandlers ({
            soundCallback: props => (statut) => {
              if (status.didJustFinish) {
                props.playbackInstance (). stopAsync ();
              } else if (status.isLoaded) {
                const position = props.isConsommation ()
                  ? props.position
                  : status.positionMillis;
                const isPlaying = (props.isSeeking () || status.isBuffering)
                  ? props.isPlaying
                  : status.isPlaying;
                props.setState ({
                  position,
                  durée: status.durationMillis,
                  shouldPlay: status.shouldPlay,
                  est en train de jouer,
                  isBuffering: status.isBuffering,
                });
              }
            },
          }), 

        Après cela, vous devez implémenter un gestionnaire pour la lecture audio. Si une instance sonore est déjà créée, vous devez décharger le média de la mémoire en appelant playbackInstance.unloadAsync () et effacez OnPlaybackStatusUpdate :

         loadPlaybackInstance: props => async (shouldPlay ) => {
              props.setState ({isLoading: true});
        
              if (props.playbackInstance ()! == null) {
                attendez props.playbackInstance (). unloadAsync ();
                props.playbackInstance (). setOnPlaybackStatusUpdate (null);
                props.setClassVariable ({playbackInstance: null});
              }
              const {sound} = attend Audio.Sound.create (
                {uri: props.playingAudio (). audioUrl},
                {shouldPlay, position: 0, durée: 1, progressUpdateIntervalMillis: 50},
                props.soundCallback,
              )
        
              props.setClassVariable ({playbackInstance: sound});
        
              props.setState ({isLoading: false});
            }, 

        Appelez le gestionnaire loadPlaybackInstance (true) en cliquant sur l'élément dans la liste. Il va automatiquement charger et lire l'audio.

        Ajoutons la fonctionnalité de pause et de lecture (bascule la lecture) au lecteur audio. Si l'audio est déjà en cours de lecture, vous pouvez le mettre en pause à l'aide de playbackInstance.pauseAsync () . Si l'audio est en pause, vous pouvez reprendre la lecture à partir du point suspendu à l'aide de la méthode playbackInstance.playAsync () :

         onTogglePlaying: props => () => {
              if (props.playbackInstance ()! == null) {
                if (props.isPlaying) {
                  props.playbackInstance (). pauseAsync ();
                } autre {
                  props.playbackInstance (). playAsync ();
                }
              }
            }, 

        Lorsque vous cliquez sur l'élément en cours de lecture, il devrait s'arrêter. Si vous voulez arrêter la lecture audio et la mettre en position 0, vous pouvez utiliser la méthode playbackInstance.stopAsync () :

         onStop: props => () => {
              if (props.playbackInstance ()! == null) {
                props.playbackInstance (). stopAsync ();
        
                props.setShowPlayer (false);
                props.setClassVariable ({playingAudio: null});
              }
            }, 

        Le lecteur audio vous permet également de rembobiner l'audio à l'aide du curseur. Lorsque vous commencez à glisser, la lecture audio doit être mise en pause avec playbackInstance.pauseAsync () .

        Une fois le glissement terminé, vous pouvez définir la position de lecture audio à l'aide de playbackInstance.setPositionAsync (valeur) ou lire l'audio à partir de la position définie avec playbackInstance.playFromPositionAsync (valeur) :

         onCompleteSliding: props => async (valeur) => {
              if (props.playbackInstance ()! == null) {
                if (props.shouldPlayAtEndOfSeek) {
                  wait props.playbackInstance (). playFromPositionAsync (valeur);
                } autre {
                  attendez props.playbackInstance (). setPositionAsync (valeur);
                }
                props.setClassVariable ({isSeeking: false});
              }
            }, 

        Après cela, vous pouvez passer les accessoires aux composants MediaList et AudioPlayer (voir le fichier src / screens / LibraryScreen / LibraryScreenView ).

        Fonctionnalité d'enregistrement vidéo avec React Native

        Procédons à l'enregistrement vidéo.

        Nous utiliserons Expo.Camera à cet effet. Expo.Camera est un composant React qui rend un aperçu de la caméra avant ou arrière de l'appareil. Expo.Camera peut également prendre des photos et enregistrer des vidéos enregistrées dans la mémoire cache de l'application.

        Pour enregistrer une vidéo, vous devez avoir la permission d'accéder à la caméra et au microphone. Ajoutons la demande d'accès à la caméra comme nous l'avons fait avec l'enregistrement audio (dans le fichier src / index.js ):

         attend Permissions.askAsync (Permissions.CAMERA); 

        L'enregistrement vidéo est disponible sur l'écran "Enregistrement vidéo". Après avoir basculé sur cet écran, l'appareil photo s'allume.

        Vous pouvez changer le type de caméra (avant ou arrière) et démarrer l'enregistrement vidéo. Pendant l'enregistrement, vous pouvez voir sa durée générale et l'annuler ou l'arrêter. Lorsque l'enregistrement est terminé, vous devrez taper le nom de la vidéo, après quoi il sera enregistré dans le Redux store .

        Voici à quoi ressemble mon interface d'enregistrement vidéo:

        Large preview

        Écrivons la logique d'enregistrement vidéo en utilisant Recomposer sur l'écran du conteneur

        src / screens / RecordVideoScreen / RecordVideoScreenContainer .

        Vous pouvez voir la liste complète des accessoires dans le composant Expo.Camera dans le document . ] Dans cette application, nous allons utiliser les accessoires suivants pour Expo.Camera .

        • type : Le type de caméra est réglé (avant ou arrière).
        • onCameraReady : Ce rappel est appelé lorsque l'aperçu de la caméra est défini. Vous ne pourrez pas démarrer l'enregistrement si la caméra n'est pas prête.
        • style : Ceci définit les styles pour le conteneur de la caméra. Dans ce cas, la taille est 4: 3.
        • ref : Ceci est utilisé pour l'accès direct au composant de caméra.

        Ajoutons la variable pour enregistrer le type et le gestionnaire pour son changement.

         cameraType: Camera.Constants.Type.back,
        toggleCameraType: state => () => ({
              cameraType: state.cameraType === Camera.Constants.Type.front
                ? Camera.Constants.Type.back
                : Camera.Constants.Type.front,
            }), 

        Ajoutons la variable pour enregistrer l'état de la caméra prête et le rappel pour onCameraReady .

         isCameraReady: false,
        
        setCameraReady: () => () => ({isCameraReady: true}), 

        Ajoutons la variable pour sauvegarder la référence et le setter du composant de caméra.

         cameraRef: null,
        
        setCameraRef: () => cameraRef => ({cameraRef}), 

        Passons ces variables et gestionnaires au composant de l'appareil photo.

          

        Maintenant, lorsque vous appelez toggleCameraType après En cliquant sur le bouton, la caméra passera de l'avant à l'arrière.

        Actuellement, nous avons accès au composant caméra via la référence, et nous pouvons démarrer l'enregistrement vidéo à l'aide de cameraRef.recordAsync ()

        La méthode recordAsync commence à enregistrer une vidéo à enregistrer dans le répertoire cache

        Arguments:

        Options (objet) – une carte d'options:

        • qualité (VideoQuality): spécifie la qualité de la vidéo enregistrée. Utilisation: Camera.Constants.VideoQuality ['']valeurs possibles: pour la résolution 16: 9 2160p, 1080p, 720p, 480p (Android uniquement) et pour 4: 3 (la taille est 640×480). Si la qualité choisie n'est pas disponible pour l'appareil, choisissez la plus haute
        • maxDuration (nombre): Durée maximale de la vidéo en secondes.
        • maxFileSize ( number): Taille maximale du fichier vidéo en octets
        • mute (booléen): Si présent, la vidéo sera enregistrée sans son.

        recordAsync renvoie une promesse qui résout à un objet contenant la propriété URI du fichier vidéo. Vous devrez sauvegarder l'URI du fichier pour lire la vidéo ci-après. La promesse est renvoyée si stopRecording a été invoqué, l'un de maxDuration et maxFileSize est atteint ou l'aperçu de la caméra est arrêté.

        les côtés de la caméra sont au format 4: 3, définissons le même format pour la qualité vidéo.

        Voici à quoi ressemble le gestionnaire pour démarrer l'enregistrement vidéo (voir le code complet du conteneur dans le référentiel):

         onStartRecording: les accessoires => async () => {
              if (props.isCameraReady) {
                props.setState ({isRecording: true, fileUrl: null});
                props.setVideoDuration ();
                props.cameraRef.recordAsync ({quality: '4: 3'})
                  .then ((fichier) => {
                    props.setState ({fichierUrl: fichier.uri});
                  });
              }
            }, 

        Pendant l'enregistrement vidéo, nous ne pouvons pas recevoir l'état d'enregistrement comme nous l'avons fait pour l'audio. C'est pourquoi j'ai créé une fonction pour définir la durée de la vidéo.

        Pour arrêter l'enregistrement vidéo, nous devons appeler la fonction suivante:

         stopRecording: props => () => {
              if (props.isRecording) {
                props.cameraRef.stopRecording ();
                props.setState ({isRecording: false});
                clearInterval (props.interval);
              }
            }, 

        Découvrez tout le processus d'enregistrement vidéo.

        Fonctionnalité de lecture vidéo avec React Native

        Vous pouvez lire la vidéo sur l'écran "Library". Les notes vidéo se trouvent dans l'onglet "Vidéo".

        Pour lancer la lecture de la vidéo, cliquez sur l'élément sélectionné dans la liste. Ensuite, passez à l'écran de lecture, où vous pouvez regarder ou supprimer la vidéo.

        L'interface utilisateur pour la lecture vidéo ressemble à ceci:

        Grand aperçu

        Pour lire la vidéo, utilisez Expo.Video un composant qui affiche une vidéo en ligne avec les autres éléments de l'interface utilisateur native de React dans votre application.

        La vidéo sera affichée sur l'écran séparé, PlayVideo.

        Vous pouvez consulter tous les les accessoires pour Expo.Video ici .

        Dans notre application, le composant Expo.Video utilise des commandes de lecture natives et ressemble à ceci:

          
        • source
          C'est la source des données vidéo à afficher. Les mêmes formes que pour Expo.Audio.Sound sont supportées
        • resizeMode
          Ceci est une chaîne décrivant comment la vidéo doit être mise à l'échelle pour être affichée dans les limites de la vue du composant. Il peut être "étirer", "contenir" ou "couvrir".
        • shouldPlay
          Ce booléen indique si le média est supposé jouer.
        • useNativeControls
          Ce booléen, si réglé à true, affiche les contrôles de lecture natifs (tels que play et pause) dans le composant vidéo.
        • onLoad
          Cette fonction est appelée une fois la vidéo chargée
        • onError [19659176] Cette fonction est appelée si le chargement ou la lecture a rencontré une erreur fatale. La fonction transmet une seule chaîne de message d'erreur en tant que paramètre

        Lorsque la vidéo est téléchargée, le bouton de lecture doit être rendu dessus

        Lorsque vous cliquez sur le bouton de lecture, la vidéo s'allume et la lecture native

        Écrivons la logique de la vidéo en utilisant Recompose dans le conteneur d'écran src / screens / PlayVideoScreen / PlayVideoScreenContainer :

         const defaultState = {
          isError: faux,
          isLoading: faux,
          isPlaying: faux,
        }
        
        const améliorer = composer (
          paramsToProps ('videoUrl'),
          withStateHandlers ({
            ...État par défaut,
            isLoading: vrai,
          }, {
            onError: () => () => ({... defaultState, isError: true}),
            onLoad: () => () => defaultState,
           onTogglePlaying: ({isPlaying}) => () => ({... defaultState, isPlaying:! isPlaying}),
          }),
        

        Comme mentionné précédemment, les objets Expo.Audio.Sound et Expo.Video partagent une API impérative unifiée pour la lecture multimédia. C'est pourquoi vous pouvez créer des contrôles personnalisés et utiliser des fonctionnalités plus avancées avec l'API de lecture.

        Découvrez le processus de lecture vidéo:

        Voir le code complet de l'application dans le référentiel . Vous pouvez également installer l'application sur votre téléphone en utilisant Expo et vérifier comment cela fonctionne dans la pratique.

        Wrapping Up

        J'espère que vous avez apprécié cet article et que vous avez enrichi vos connaissances de React Native . Vous pouvez utiliser ce didacticiel d'enregistrement audio et vidéo pour créer votre propre lecteur multimédia personnalisé. Vous pouvez également mettre à l'échelle la fonctionnalité et ajouter la possibilité d'enregistrer des fichiers multimédias dans la mémoire du téléphone ou sur un serveur, de synchroniser les données multimédias entre différents périphériques et de partager des fichiers multimédias avec d'autres.

        . Si vous avez des questions sur le processus de développement d'une application d'enregistrement audio ou vidéo avec React Native, n'hésitez pas à laisser un commentaire ci-dessous