我想使用Java Sound API将两个数据缓冲区作为单独的声道输出到一个音频文件中。我找到了输出单声道音频的方法,但那不是我正在寻找的。我也不知道我应该使用哪种音频格式(WAV,MP3等)。我的两个数据缓冲区是从-127到+127的字节数组。保存多声道音频文件
1
A
回答
0
1
以下是一些示例代码,显示如何创建WAV
文件。 Java并没有真正支持MP3
,尽管有这样的库。
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
public class StereoOutput {
public static void main(final String[] args) throws IOException {
// left samples - typically more than 4!!
final byte[] left = new byte[] {1, 2, 3, 4};
// right samples
final byte[] right = new byte[] {1, 2, 3, 4};
final ByteArrayInputStream interleavedStream = createInterleavedStream(left, right);
// audio format of the stream we created
final AudioFormat audioFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
44100f, // sample rate - you didn't specify, 44.1k is typical
8, // how many bits per sample, i.e. per value in your byte array
2, // you want two channels (stereo)
2, // number of bytes per frame (frame == a sample for each channel)
44100f, // frame rate
true); // byte order
final int numberOfFrames = left.length; // one frame contains both a left and a right sample
// wrap stream into AudioInputStream (data + format)
final AudioInputStream audioStream = new AudioInputStream(interleavedStream, audioFormat, numberOfFrames);
// write to WAV file
AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, new File("out.wave"));
}
/**
* Typically in PCM audio, left and right samples are interleaved.
* I.e.: LR LR LR LR.
* One LR is also called a "frame".
*
* @param left array with left samples
* @param right array with right samples
* @return stream that contains all samples in LR LR interleaved order
*/
private static ByteArrayInputStream createInterleavedStream(final byte[] left, final byte[] right) {
final byte[] interleaved = new byte[left.length + right.length];
for (int i=0; i<left.length; i++) {
interleaved[2*i] = left[i];
interleaved[2*i+1] = right[i];
}
return new ByteArrayInputStream(interleaved);
}
}
我建议通过Java Sound Trail自己的方式工作,并检查出了Java API文档类,比如AudioFormat。如果您不熟悉PCM,请阅读。理解数字采样音频至关重要。
相关问题
- 1. pygame保存音频文件
- 2. 音频文件左/右声道
- 3. NSDocument保存音频和视频文件
- 4. 保存多个录音音频文件并获取所有录音音频
- 5. AVAudioPlayerNode多声道音频控制
- 6. AVAudioEngine播放多声道音频
- 7. 如何使用Naudio从WAV文件播放多声道音频?
- 8. 保存音频流为MP3文件(iOS)
- 9. 音频文件保存到NSURL
- 10. 保存会议播放音频文件
- 11. 保存音频文件KIVY,PYTHON
- 12. 在iPod库中保存音频文件
- 13. 如何从两个单声道音频文件创建一个立体声音频文件与代码android
- 14. 保存按顺序播放的声音作为一个音频文件
- 15. 控制音频文件声音
- 16. AVPlayer播放单声道音频立体声 - >单声道
- 17. Red5将多个音频流保存为单个文件
- 18. Android:连续播放多个音频文件时声音重叠
- 19. 多个音频文件,一个声音对象?
- 20. 使用Android的语音识别软件保存音频文件
- 21. 将文件保存为音频文件后未播放文件
- 22. iOS音频播放器 - 在左右声道中同步文件
- 23. 保存流或缓冲的音频文件,文档文件夹
- 24. 音频漂移当管道声音在扬声器在Node.js
- 25. Android:语音识别临时音频文件在哪里保存?
- 26. 更改音频文件的音调并用NAudio保存
- 27. 如何将音频文件保存到语音备忘录
- 28. 用Sphinx4将语音保存到音频文件中
- 29. 保存带背景音乐的音频文件
- 30. 未找到文件 - 保存声音文件的位置?
为了澄清,您是通过Java应用程序播放声音还是导出/写入声音文件?当你说单独的频道时,你是否希望将缓冲区中的数据放入立体声左边,并将两个缓冲区放入立体声右边?或者你在说别的什么? –