【问题标题】:How to merge two or more mp3 audio file in android?如何在android中合并两个或多个mp3音频文件?
【发布时间】:2016-05-22 06:28:55
【问题描述】:

我正在尝试合并 mp3 音频文件但不成功。

这是我的代码。

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


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

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

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

            SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
            FileOutputStream fostream = new FileOutputStream(new File(filesToMearge.get(0).getPath()),true);//destinationfile

            int temp;

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

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


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

}

例如

firstFileSize =12kb

secondFileSize =10kb

finalfileSize=22kb

尺寸准确但声音缺失

没有错误,但结果我发现 finalfile 只包含第一个文件音频第二个文件音频丢失。

不知道是什么问题。如果有人知道解决方案帮助我。

谢谢

【问题讨论】:

    标签: android audio merge mp3


    【解决方案1】:

    为时已晚。但是,仍然有人可能需要适当的解决方案。这就是为什么我建议使用AudioMixer-android 库。

    【讨论】:

      【解决方案2】:

      字符串 wavFile1 = android.os.Environment.getExternalStorageDirectory()+"/Download/a.mp4"; 字符串 wavFile2 = android.os.Environment.getExternalStorageDirectory()+"/Download/b.mp4"; FileInputStream fistream1 = null; // 第一个源文件 尝试 { fistream1 = new FileInputStream(wavFile1); FileInputStream fistream2 = new FileInputStream(wavFile2);//第二个源文件 SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2); FileOutputStream fostream = new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+"/Download/merge1.mp4");//destinationfile

              int temp;
      
              while( ( temp = sistream.read() ) != -1)
              {
                  // System.out.print( (char) temp ); // to print at DOS prompt
                  fostream.write(temp);   // to write to file
              }
              Log.e("Result","Done");
      
              fostream.close();
              sistream.close();
              fistream1.close();
              fistream2.close();
      
              Toast.makeText(this, "Done", Toast.LENGTH_SHORT).show();
          }
          catch (FileNotFoundException e) {
              e.printStackTrace();
              Log.e("Not",e+"");
              Toast.makeText(this, "File not Found", Toast.LENGTH_SHORT).show();
          }
          catch (IOException e)
          {
              Toast.makeText(this, ""+e, Toast.LENGTH_SHORT).show();
          }
      

      【讨论】:

        【解决方案3】:

        有一个功能可以合并音频或视频文件

        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), "rws").getChannel();
                    container.writeContainer(fileChannel);
                    fileChannel.close();
                    return true;
                }
                catch (IOException e) {
                    Log.e("MYTAG", "Error merging media files. exception: "+e.getMessage());
                    return false;
                }
            }
        
        • 如果你有音频,isAudio 应该是真的。如果你有视频isAudio 应该是假的
        • sourceFiles[] 数组应该包含媒体文件的目的地,例如

          /sdcard/my_songs/audio_1, /sdcard/my_songs/audio_2, /sdcard/my_songs/audio_3

        • targetFile 是您最终的音频合并文件应该类似于

          /sdcard/my_songs/final_audio_1

        • 如果你处理大文件,最好在后台合并文件,你可以使用AsynkTask

        【讨论】:

        • 这也使用mp4parser所以恕我直言它只能生成mp4格式:/
        【解决方案4】:

        我也为此苦苦挣扎并使用mp4parser解决了它

        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;
        

        对于你的情况,我相信这样的事情应该有效:

        public static void mergeAudio(List<File> filesToMerge) {
        
            String output = Environment.getExternalStorageDirectory().getAbsolutePath() + "output.mp3";
        
            while (filesToMerge.size()!=1){
        
                try {
        
                    String[] videoUris = new String[]{
                        filesToMerge.get(0).getPath(),
                        filesToMerge.get(0).getPath()
                    };
        
                    List<Track> videoTracks = new LinkedList<Track>();
                    List<Track> audioTracks = new LinkedList<Track>();
        
                    for (Movie m : inMovies) {
                        for (Track t : m.getTracks()) {
                            if (t.getHandler().equals("soun")) {
                                audioTracks.add(t);
                            }
                            if (t.getHandler().equals("vide")) {
                                videoTracks.add(t);
                            }
                        }
                    }
        
                    Movie result = new Movie();
        
                    if (!audioTracks.isEmpty()) {
                        result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
                    }
                    if (!videoTracks.isEmpty()) {
                        result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
                    }
        
                    Container out = new DefaultMp4Builder().build(result);
        
                    FileChannel fc = new RandomAccessFile(output, "rw").getChannel();
                    out.writeContainer(fc);
                    fc.close();
        
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        

        有一些答案表明,例如:

        【讨论】:

        • @SimpleCoder 我有一个使用此代码运行的生产应用程序。如果您在实施方面需要任何帮助,请告诉我。
        • 是的..我被困在这个问题上,请帮助我。可以通过 ysapps16@gmail.com 联系到我
        • 请让我知道您尝试了什么以及卡在哪里。
        • 我试过上面的代码,但不知道什么是'Track'。
        • @SimpleCoder 如果可行,您是否对此进行了测试? inMovies变量的声明在哪里?
        猜你喜欢
        • 1970-01-01
        • 2014-03-25
        • 2011-12-06
        • 2019-05-19
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        相关资源
        最近更新 更多