Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用附加模式将音频录制到现有音频文件中?_Android_Audio Recording_Mediarecorder - Fatal编程技术网

Android 如何使用附加模式将音频录制到现有音频文件中?

Android 如何使用附加模式将音频录制到现有音频文件中?,android,audio-recording,mediarecorder,Android,Audio Recording,Mediarecorder,如何使用append模式将音频录制到现有音频文件中,该模式在单个文件中同时包含音频录制 例如: 我已经录制了1.amr文件。播放时间是00:30秒,现在我必须再录制一个00:20秒,但文件应该是相同的,下一次录制应该附加现有的00:30秒录制。所以现在播放时间是00:50秒。 在Java或Android中可能吗? 任何库都可以使用吗?我曾经遇到过同样的问题。。我发现的是。。大多数应用程序分别捕获音频,然后合并 实际上,“您不能在录制时这样做” 所以 如果您对第三方LIB没有问题。。。你可以走了

如何使用append模式将音频录制到现有音频文件中,该模式在单个文件中同时包含音频录制

例如:

我已经录制了1.amr文件。播放时间是00:30秒,现在我必须再录制一个00:20秒,但文件应该是相同的,下一次录制应该附加现有的00:30秒录制。所以现在播放时间是00:50秒。
在Java或Android中可能吗?

任何库都可以使用吗?

我曾经遇到过同样的问题。。我发现的是。。大多数应用程序分别捕获音频,然后合并

实际上,“您不能在录制时这样做”

所以

如果您对第三方LIB没有问题。。。你可以走了

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;
    }


}
导入com.coremedia.iso.box.Container;
导入com.googlecode.mp4parser.authoring.Movie;
导入com.googlecode.mp4parser.authoring.Track;
导入com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder;
导入com.googlecode.mp4parser.authoring.container.mp4.MovieCreator;
导入com.googlecode.mp4parser.authoring.tracks.AppendTrack;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.RandomAccessFile;
导入java.nio.channels.FileChannel;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.Comparator;
导入java.util.List;
/**
*由crazy_程序员于2017年9月25日创建。
*/
公共类音频{
私有字符串dest_file_name;
公共音频\u util(字符串dest\u name){
dest\u file\u name=dest\u name;
}
公共字符串ConcatAudios(文件…mp3Files){
if(mp3Files==null)返回null;
文件合并文件=新文件(目标文件名);
用于(文件fi:MP3文件){
Log.e(“Mod dates”和“+fi.lastModified());
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//对阵列进行音频序列排序
如果(mp3Files.length>1){
sort(mp3Files,newcomparator(){
@凌驾
公共int比较(文件object1、文件object2){
返回Long.valueOf(object1.lastModified()).compareTo(object2.lastModified());
}
});
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
用于(文件fi:MP3文件){
Log.e(“Mod dates 2nd”和“+fi.lastModified());
}
FileOutputStream=null;
字符串文件_name=null;
试一试{
如果(!mergedFile.exists()){
mergedFile.createNewFile();
}
Movie[]movies=新电影[mp3Files.length];
对于(int i=0;i1){
file_name=mergedFile.getName();
}
}捕获(例外e){
Log.e(“mp3Files main expt”,e.getMessage());
}最后{
试一试{
如果(fos!=null){
fos.flush();
fos.close();
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
返回文件名;
}
}

您需要单独记录文件,然后才能将它们连接在一起

使用原始AMR格式。i、 e.将记录器设置设置为:

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

在原始AMR中生成音频文件后,可以通过将要附加的文件的前6个字节分条来加入这些文件。以二进制模式打开音频文件进行相同操作。

您几乎需要将其解码为wav并将文件拼接在一起,然后重新编码。amr文件是压缩的,通常不可能只将数据附加到压缩文件中,从而获得有效的文件。特别是如果你想做一种以上的格式。谢谢你的建议。我将只使用一种格式,对我来说。wav将工作。但是怎么做呢?您有任何代码示例或库。请让我知道…是的@sahaj你是救生员。。。。经过两天的研发,解决了我的问题。