如何使用附加模式將音頻錄製到現有音頻文件中,該模式包含單個文件中的音頻錄製。如何使用附加模式將音頻錄製到現有的音頻文件中?
例如:
我記錄了1.amr文件。播放時間爲00:30秒,現在我必須錄製另一個00:20秒,但文件應該相同,下一個錄音應該附加現有的00:30秒錄音。所以現在玩的時間是00:50秒。
Java或Android可能嗎?
任何圖書館可用於此?
如何使用附加模式將音頻錄製到現有音頻文件中,該模式包含單個文件中的音頻錄製。如何使用附加模式將音頻錄製到現有的音頻文件中?
例如:
我記錄了1.amr文件。播放時間爲00:30秒,現在我必須錄製另一個00:20秒,但文件應該相同,下一個錄音應該附加現有的00:30秒錄音。所以現在玩的時間是00:50秒。
Java或Android可能嗎?
任何圖書館可用於此?
您需要單獨記錄文件,然後將它們連接在一起。
使用RAW AMR格式。即集記錄設置:
recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
一旦你有RAW AMR生成的音頻文件,您可以通過條帶化文件的第6輪輪空要附加加入這些文件。以相同的二進制模式打開音頻文件。
Yup @sahaj你是救命的人....在研發2天后解決了我的問題。 –
我曾經有同樣的問題..我發現的是..大多數的應用程序分別捕獲音頻,然後結合然後。
其實,「你不能在錄音時間這樣做」。
所以,
如果您有與第三方庫沒有問題......在這裏,你可以走了。
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;
}
}
你幾乎需要將它解碼爲wav並將文件拼接在一起,然後重新編碼。 amr文件是壓縮的,它通常不可能將數據附加到壓縮文件並得到有效的文件。特別是如果你想做多種格式。 –
謝謝你的建議。我將只使用一種格式,對我來說,.wav將起作用。但怎麼做呢?你有任何代碼示例或庫。請讓我知道.. –