2015-09-08 2 views
2

У меня есть приложение, которое записывает звук с помощью MediaRecorder from MIC всякий раз, когда телефонный звонок присутствует, мне нужно, чтобы быть в состоянии сохранить последние х минут от этой записи, когда вызов завершен - например, разделите аудиофайл, созданный записью.Сплит аудио файлов в Android

Я искал это и все, что мог найти, - как разбить файл .wav, удалив байт из файла. Но я спасаю файл в: MediaRecorder.OutputFormat.THREE_GPP с кодировкой: MediaRecorder.OutputFormat.AMR_NB, и я не нашел способ разделить этот тип файла.

Это мой код:

public class Recorder 
    { 
    private MediaRecorder myRecorder; 
    public String outputFile = null; 
    private Context context = null; 

    public Recorder(Context context_app) 
    { 
     context = context_app; 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss",  Locale.getDefault()); 
     df.setTimeZone(TimeZone.getDefault()); 
     String time = df.format(new Date()); 
     outputFile = Environment.getExternalStorageDirectory(). 
       getAbsolutePath() + "/"+time+".3gpp"; //this is the folder in which your Audio file willl save 
     myRecorder = new MediaRecorder(); 
     myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); 
     myRecorder.setOutputFile(outputFile); 
    } 


    public void start() { 
     try { 
      myRecorder.prepare(); 
      myRecorder.start(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Toast.makeText(context, e.getMessage(), 
        Toast.LENGTH_SHORT).show(); 
      // prepare() fails 
      e.printStackTrace(); 
     } 

     Toast.makeText(context, "Start recording...", 
       Toast.LENGTH_SHORT).show(); 
    } 

    public void stop() { 
     try { 
      myRecorder.stop(); 
      myRecorder.reset(); 
      myRecorder.release(); 
      myRecorder = null; 

      Toast.makeText(context, "Stop recording...", 
        Toast.LENGTH_SHORT).show(); 
     } catch (RuntimeException e) { 
      // no valid audio/video data has been received 
      e.printStackTrace(); 
     } 
    } 
} 

Как я могу разделить THREE_GPP временем и сохранить часть мне нужно в отдельном файле?

Кроме того, я ничего не знаю о манипулировании байтов и файлов непосредственно, поэтому просьба уточнить, если это так, как вы ее решили.

Заранее спасибо

+0

Это не очень простая операция. аудио файлы имеют заголовок, и когда вы пытаетесь удалить что-то с самого начала вы должны позаботиться, чтобы переместить все время заголовок на новое место ... – danysz

+0

, что это хороший повод, чтобы спросить, как это может быть сделано :) –

ответ

2

библиотека Использование FFMPEG вырезать/разделить часть любого медиа-файла. Кстати, компиляция FFMPEG - еще одна сложная часть, но вы можете использовать предварительно скомпилированную библиотеку, такую ​​как https://github.com/WritingMinds/ffmpeg-android-java.

Вот пример того, как скомпилировать & использовать команду FFMPEG: https://github.com/JesusMartinAlonso/Video4Share. Из образца я смог разделить 3gp-файлы следующим образом:

// ffmpeg command sample: "-y -i inputPath -ss 00:00:02 -codec copy -t 00:00:06 outputPath" 
    public String getSplitCommand(String inputFileUrl, String outputFileUrl, 
             String start, String end) { 
     if ((TextUtils.isEmpty(inputFileUrl) && (TextUtils.isEmpty(outputFileUrl)))) { 
      return null; 
     } 
     StringBuilder stringBuilder = new StringBuilder(); 
     stringBuilder.append("-y ") 
       .append("-i ") 
       .append(inputFileUrl).append(" ") 
       .append("-ss ") 
       .append(start).append(" ") 
       .append("-codec ") 
       .append("copy ") 
       .append("-t ") 
       .append(end).append(" ") 
       .append(outputFileUrl); 
     return stringBuilder.toString(); 
    } 

public void executeBinaryCommand(FFmpeg ffmpeg, ProgressDialog progressDialog, final String command) { 
     if (!TextUtils.isEmpty(command)) { 
      try { 
       ffmpeg.execute(command, new ExecuteBinaryResponseHandler() { 
        @Override 
        public void onFailure(String response) { 
         progressDialog.setMessage(response); 
        } 

        @Override 
        public void onSuccess(String response) { 
         progressDialog.setMessage(response); 

        } 

        @Override 
        public void onProgress(String response) { 
         progressDialog.setMessage(response); 
        } 

        @Override 
        public void onStart() { 
         progressDialog.show(); 
        } 

        @Override 
        public void onFinish() { 
         progressDialog.dismiss(); 
        } 
       }); 
      } catch (FFmpegCommandAlreadyRunningException exception) { 
       exception.printStackTrace(); 
      } 
     } 
    } 
+0

Привет. Вы должны написать наиболее важные части решения здесь, потому что содержание указали по вашей ссылке, может уйти в будущем –

+0

я понимаю, ответ обновляется! –

+0

Спасибо! принято –

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