如何合并两个音频.wav文件 [英] How to merge two audio .wav file
问题描述
我知道吗?我合并两个.wav文件到一个file.But这个问题已经讨论过,但之后GOOGLE了很多我不能能够找到解决办法为什么是两个合并的.wav文件不能播放合并的文件正在播放只是一second.Nothing else.After点击播放按钮,它起着一个second.Please给我建议或检查我的code,以确定advance.The code中的problem.Thanks我用两个合并两个文件是如下:
I know this question is discussed already but after googled a lot I cant able to find the solution why two .wav merged file is not playable?I am merging two .wav file into one file.But the merged file is being played for just a second.Nothing else.After Click on play button it plays for a second.Please give me suggestion or check my code to identify the problem.Thanks in advance.The code I am using two merge two files is as below:
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_BPP = 16;
private void CombineWaveFile(String file1, String file2, String path) {
FileInputStream in1 = null, in2 = null;
FileOutputStream out = null;
long totalAudioLen = 0;
long totalDataLen = totalAudioLen + 36;
long longSampleRate = RECORDER_SAMPLERATE;
int channels = 2;
long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8;
byte[] data = new byte[8192];
try {
in1 = new FileInputStream(file1);
in2 = new FileInputStream(file2);
File file_path = new File(path);
file_path.setReadable(true);
out = new FileOutputStream(file_path);
totalAudioLen = in1.getChannel().size() + in2.getChannel().size();
totalDataLen = totalAudioLen + 36;
WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
longSampleRate, channels, byteRate);
while (in1.read(data) != -1) {
out.write(data);
}
while (in2.read(data) != -1) {
out.write(data);
}
out.close();
in1.close();
in2.close();
Log.e("mPAthTemp Combine", file_path.toString());
Log.e("mFileSecond Combine", file2);
Toast.makeText(this, "Done!!", Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,
long totalDataLen, long longSampleRate, int channels, long byteRate)
throws IOException {
byte[] header = new byte[44];
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = 16;
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1;
header[21] = 0;
header[22] = (byte) channels;
header[23] = 0;
header[24] = (byte) (longSampleRate & 0xff);
header[25] = (byte) ((longSampleRate >> 8) & 0xff);
header[26] = (byte) ((longSampleRate >> 16) & 0xff);
header[27] = (byte) ((longSampleRate >> 24) & 0xff);
header[28] = (byte) (byteRate & 0xff);
header[29] = (byte) ((byteRate >> 8) & 0xff);
header[30] = (byte) ((byteRate >> 16) & 0xff);
header[31] = (byte) ((byteRate >> 24) & 0xff);
header[32] = (byte) (2 * 16 / 8);
header[33] = 0;
header[34] = RECORDER_BPP;
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte) (totalAudioLen & 0xff);
header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
out.write(header, 0, 44);
}
}
code我使用播放音频文件如下:
Code I am using to play the audio file is as below:
private void startPlaying(String file_path) {
mPlayer = new MediaPlayer();
try {
Log.e("playing", file_path);
mPlayer.setDataSource(file_path);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.prepare();
mPlayer.start();
mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
showToast("Complete");
setProgressBar(false);
mButtonStart.setEnabled(true);
mButtonStop.setEnabled(false);
stopPlaying();
}
});
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
给我一个解决方案,为什么这个happen.Thanks ..
Give me a solution why this happen.Thanks..
推荐答案
我不知道具体是什么导致你的具体问题,但这个code散落着缺陷,一些组合都可以解释你的问题。以下是通过检查什么,我看到:
I don't know what specifically causes your specific problem, but this code is littered with bugs, some combination of which might explain your problem. Here's what I spotted by inspection:
- 它假定传入的文件是相同的格式(16位立体声,44100等),而不检查。
- 它不会在所有解析传入文件。因此它把输入的文件作为音频数据的标头,并追加了对传出文件(亚克西!)。这是特别奇怪的考虑仔细写入输出文件的标题。
- 它不检查read()方法的返回值,从而书写更大的块比它在某些情况下(尤其是每个输入文件的最后一个块)的读取。
也许你需要一些新的样本code。 JSResources 可能是一个良好的开端。
Perhaps you need some new sample code. JSResources might be a good place to start.
这篇关于如何合并两个音频.wav文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!