2017-10-28 78 views
-2

如何使用附加模式將音頻錄製到現有音頻文件中,該模式包含單個文件中的音頻錄製。如何使用附加模式將音頻錄製到現有的音頻文件中?

例如:

我記錄了1.amr文件。播放時間爲00:30秒,現在我必須錄製另一個00:20秒,但文件應該相同,下一個錄音應該附加現有的00:30秒錄音。所以現在玩的時間是00:50秒。
Java或Android可能嗎?
任何圖書館可用於此?

+0

你幾乎需要將它解碼爲wav並將文件拼接在一起,然後重新編碼。 amr文件是壓縮的,它通常不可能將數據附加到壓縮文件並得到有效的文件。特別是如果你想做多種格式。 –

+0

謝謝你的建議。我將只使用一種格式,對我來說,.wav將起作用。但怎麼做呢?你有任何代碼示例或庫。請讓我知道.. –

回答

0

您需要單獨記錄文件,然後將它們連接在一起。

使用RAW AMR格式。即集記錄設置:

recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

一旦你有RAW AMR生成的音頻文件,您可以通過條帶化文件的第6輪輪空要附加加入這些文件。以相同的二進制模式打開音頻文件。

+0

Yup @sahaj你是救命的人....在研發2天后解決了我的問題。 –

0

我曾經有同樣的問題..我發現的是..大多數的應用程序分別捕獲音頻,然後結合然後。

其實,「你不能在錄音時間這樣做」

所以,

如果您有與第三方庫沒有問題......在這裏,你可以走了。

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

代碼示例。

import com.coremedia.iso.boxes.Container; 
import com.googlecode.mp4parser.authoring.Movie; 
import com.googlecode.mp4parser.authoring.Track; 
import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; 
import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator; 
import com.googlecode.mp4parser.authoring.tracks.AppendTrack; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.RandomAccessFile; 
import java.nio.channels.FileChannel; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.List; 

/** 
* Created by crazy_programmer on 9/25/2017. 
*/ 

public class Audio_util { 

    private String dest_file_name; 

    public Audio_util(String dest_name) { 
     dest_file_name = dest_name; 
    } 


    public String ConcatAudios(File... mp3Files) { 

     if(mp3Files == null) return null; 

     File mergedFile = new File(dest_file_name); 

     for(File fi : mp3Files){ 
      Log.e("Mod dates",""+fi.lastModified()); 
     } 

     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
     // sort the array for audio sequence 

     if (mp3Files.length > 1) { 
      Arrays.sort(mp3Files, new Comparator<File>() { 
       @Override 
       public int compare(File object1, File object2) { 
        return Long.valueOf(object1.lastModified()).compareTo(object2.lastModified()); 
       } 
      }); 
     } 
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 


     for(File fi : mp3Files){ 
      Log.e("Mod dates 2nd",""+fi.lastModified()); 
     } 

     FileOutputStream fos = null; 
     String file_name = null; 
     try { 
      if (!mergedFile.exists()) { 
       mergedFile.createNewFile(); 
      } 
      Movie[] movies = new Movie[mp3Files.length]; 
      for (int i = 0; i < mp3Files.length; i++) { 
       movies[i] = MovieCreator.build(mp3Files[i].getAbsolutePath()); 
      } 

      final Movie finalMovie = new Movie(); 

      List<Track> audioTracks = new ArrayList<>(); 
      for (Movie movie : movies) { 
       for (Track track : movie.getTracks()) { 
        if (track.getHandler().equals("soun")) { 
         audioTracks.add(track); 
        } 
       } 
      } 

      finalMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()]))); 

      final Container container = new DefaultMp4Builder().build(finalMovie); 
      FileChannel fc = new RandomAccessFile(mergedFile, "rw").getChannel(); 
      container.writeContainer(fc); 
      fc.close(); 

      if (mergedFile.exists() && mergedFile.length() > 1) { 
       file_name = mergedFile.getName(); 
      } 

     } catch (Exception e) { 
      Log.e("mp3Files main excpt", e.getMessage()); 
     } finally { 
      try { 
       if (fos != null) { 
        fos.flush(); 
        fos.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return file_name; 
    } 


} 
相關問題