2016-09-04 2 views
2

При использовании MediaRecorder, у нас нет паузы/резюме для уровня API ниже 24. Так что может быть способ сделать это:Пауза и резюме с Android MediaRecorder (уровень API <24)

  1. В случае приостановки остановите рекордер и создайте записанный файл.
  2. И при возобновлении записи снова записывайте и создайте другой файл и продолжайте делать это до тех пор, пока пользователь не остановит нажатие.
  3. И, наконец, слить все файлы.

Многие люди задавали этот вопрос так, но не смогли найти решение. Люди говорят о создании нескольких медиафайлов, останавливая запись в режиме паузы и перезапуская при возобновлении. Поэтому мой вопрос: как мы можем программно объединить/объединить все медиафайлы?

Примечание: в моем случае. Контейнер MPEG4 - m4a для аудио и mp4 для видео.

Я попытался использовать SequenceInputStream, чтобы объединить несколько InputStream соответствующих сгенерированных записанных файлов. Но он всегда выводит только первый файл.

Код сниппета:

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

Возможный дубликат [Пауза и возобновление записи звука в Android] (https://stackoverflow.com/questions/5743165/pause-and-resume-audio-recording-in-android) – soshial

ответ

9

я мог бы решить эту проблему с помощью mp4parser библиотеки. Спасибо большое автору этой библиотеки :)

Добавить ниже зависимость в вашем Gradle файле:

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

Решение остановить рекордером, когда пауза пользователя и начать снова на резюме, как уже упоминалось во многих других ответов в переполнение стека. Храните все аудио/видео файлы, сгенерированные в массиве, и используйте метод ниже для объединения всех медиафайлов. Пример также взят из библиотеки mp4parser и немного модифицирован по моей потребности.

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; 
     } 
    } 

Использовать флаг isAudio как истинный для аудиофайлов и false для видеофайлов.

Смежные вопросы