2016-02-14 21 views
1

我想合并/加入两个音频文件。但合并文件只包含第一个文件音频不知道是什么问题。我认为与headers.But问题'不知道如何解决它。在Android中合并音频文件不工作

e.g

F1 = 4KB

F2 = 3KB

finalFile = 7 KB

大小显示合并完成,但不知道为什么音频错过了第二个文件。

这是我的代码。

public static void meargeAudio(List<File> filesToMearge) 
{ 


    while (filesToMearge.size()!=1){ 

     try { 



      FileInputStream fistream1 = new FileInputStream(filesToMearge.get(0).getPath()); //(/storage/emulated/0/Audio Notes/1455194356500.mp3) first source file 
      FileInputStream fistream2 = new FileInputStream(filesToMearge.get(1).getPath());//second source file 

      SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2); 
      FileOutputStream fostream = new FileOutputStream(AppConstrants.APP_FOLDER_PATH+"sss.mp3",true); 
      int temp; 

      while ((temp = sistream.read()) != -1) { 
       // System.out.print((char) temp); // to print at DOS prompt 
       fostream.write(temp); // to write to file 
      } 


      fostream.close(); 
      sistream.close(); 
      fistream1.close(); 
      fistream2.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

如果可以,请帮助我。

在此先感谢。

回答

1

解决方案:

mp4parser可以使用附加的音频文件

https://github.com/sannies/mp4parser/issues/155

使用:

aspectjrt-1.7.3.jar

我的工作代码:

public static void mergAudio(List<File> filesToMearge){ 


    try { 
     while (filesToMearge.size()!=1) { 

      String audio1 = filesToMearge.get(0).getPath(); 
      String audio2 = filesToMearge.get(1).getPath(); 


      // FileOutputStream fostream = new FileOutputStream(filesToMearge.get(0).getPath(),true);//destinationfile 
      String outputVideo = filesToMearge.get(0).getPath(); 

      Movie[] inMovies = new Movie[]{ 
        MovieCreator.build(audio1), 
        MovieCreator.build(audio2), 
      }; 

      List<Track> audioTracks = new LinkedList<Track>(); 

      for (Movie m : inMovies) { 
       for (Track t : m.getTracks()) { 
        if (t.getHandler().equals("soun")) { 
         audioTracks.add(t); 
        } 
       } 
      } 


      File file1 = new File(filesToMearge.get(0).getPath()); 
      boolean deleted = file1.delete(); 
      File file2 = new File(filesToMearge.get(1).getPath()); 
      boolean deleted1 = file2.delete(); 


      Movie result = new Movie(); 

      if (audioTracks.size() > 0) { 
       result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()]))); 
      } 

      Container out = new DefaultMp4Builder().build(result); 
      out.writeContainer(new FileOutputStream(outputVideo).getChannel()); 


      filesToMearge.add(0, new File(filesToMearge.get(0).getPath())); 
      filesToMearge.remove(1); 
      filesToMearge.remove(1); 

     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
+0

不工作:java.lang.NullPointerException:试图在“MovieCreator中的空对象引用上调用虚方法'java.util.List com.coremedia.iso.boxes.MovieBox.getBoxes(java.lang.Class)' .build(音频1)”。音频文件是mp3。 – user2983041

2

你对标题问题是正确的。您的新音频文件只能被识别为第一个音频文件的原因,因为您可以直接连接两个音频文件。当MediaPlayer读取合并的音频标题(比特率,音频数据等)时,它只会识别您的第一个音频文件,因为这是它首先找到的。为了正确连接2个音频文件,您需要读取它们的头文件并解码它们的音频数据,重新计算合并后的音频数据的新长度,并对未压缩的音频数据进行解压缩(例如MP3),然后将其写入文件。