2016-09-04 4 views
2

Lors de l'utilisation MediaRecorder, on n'a pas de pause/reprise pour le niveau de l'API ci-dessous 24. Donc, il peut y avoir une façon de le faire est la suivante:Pause et Reprendre avec Android MediaRecorder (niveau API <24)

  1. Lors d'un événement de pause, arrêtez l'enregistreur et créez le fichier enregistré.
  2. Et à la reprise, recommencez l'enregistrement et créez un autre fichier et continuez jusqu'à ce que l'utilisateur appuie sur stop.
  3. Et enfin fusionner tous les fichiers.

Beaucoup de personnes ont posé cette question sur SO, mais n'ont pas réussi à trouver quoi que ce soit pour résoudre ce problème. Les gens parlent de créer plusieurs fichiers multimédias en arrêtant l'enregistrement sur l'action de pause et en redémarrant sur le CV. Donc, ma question est Comment pouvons-nous fusionner/joindre tous les fichiers multimédia par programme?

Remarque: dans mon cas Conteneur MPEG4 - m4a pour l'audio et mp4 pour la vidéo.

J'ai essayé d'utiliser SequenceInputStream pour fusionner plusieurs InputStream de fichiers enregistrés générés respectifs. Mais il résulte toujours le premier fichier seulement.

Code Snippet:

Enumeration<InputStream> enu = Collections.enumeration(inputStreams); 
     SequenceInputStream sqStream = new SequenceInputStream(enu); 
     while ((oneByte = sqStream.read(buffer)) != -1) { 
      fileOutputStream.write(buffer, 0, oneByte); 

     } 
     sqStream.close(); 
     while (enu.hasMoreElements()) { 
      InputStream element = enu.nextElement(); 
      element.close(); 
     } 
     fileOutputStream.flush(); 
     fileOutputStream.close(); 
+0

Copie possible de [Pause et reprise de l'enregistrement audio sur Android] (https://stackoverflow.com/questions/5743165/pause-and-resume-audio-recording-in-android) – soshial

Répondre

9

je pouvais résoudre ce problème en utilisant la bibliothèque mp4parser. Merci beaucoup à l'auteur de cette bibliothèque :)

Ajouter ci-dessous dépendance dans votre fichier gradle:

compile 'com.googlecode.mp4parser:isoparser:1.0.2' 

La solution est d'arrêter l'enregistreur lorsque pause utilisateur et recommencer le curriculum vitae comme déjà mentionné dans beaucoup d'autres réponses à stackoverflow. Stockez tous les fichiers audio/vidéo générés dans un tableau et utilisez la méthode ci-dessous pour fusionner tous les fichiers multimédia. L'exemple est également extrait de la bibliothèque mp4parser et modifié un peu selon mes besoins.

public static boolean mergeMediaFiles(boolean isAudio, String sourceFiles[], String targetFile) { 
     try { 
      String mediaKey = isAudio ? "soun" : "vide"; 
      List<Movie> listMovies = new ArrayList<>(); 
      for (String filename : sourceFiles) { 
       listMovies.add(MovieCreator.build(filename)); 
      } 
      List<Track> listTracks = new LinkedList<>(); 
      for (Movie movie : listMovies) { 
       for (Track track : movie.getTracks()) { 
        if (track.getHandler().equals(mediaKey)) { 
         listTracks.add(track); 
        } 
       } 
      } 
      Movie outputMovie = new Movie(); 
      if (!listTracks.isEmpty()) { 
       outputMovie.addTrack(new AppendTrack(listTracks.toArray(new Track[listTracks.size()]))); 
      } 
      Container container = new DefaultMp4Builder().build(outputMovie); 
      FileChannel fileChannel = new RandomAccessFile(String.format(targetFile), "rw").getChannel(); 
      container.writeContainer(fileChannel); 
      fileChannel.close(); 
      return true; 
     } 
     catch (IOException e) { 
      Log.e(LOG_TAG, "Error merging media files. exception: "+e.getMessage()); 
      return false; 
     } 
    } 

Utilisez flag isAudio comme true pour les fichiers audio et false pour les fichiers vidéo.