2017-10-28 124 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; 
    } 


} 
相关问题