如何在Java中从字节数组编写WAV文件
我想开发一个简单的java音乐播放器,使用这个Sonic算法来加速和播放音乐。这是主类:。java只是调用Sonic.java,然后它就可以播放音乐了。尽管它在运行WAV文件时工作得很好,但我想要的是从加速的输入流中编写一个新的WAV文件 我尝试在Main.java的do while循环中将字节写入ByteArrayOutputStream,并将它们转换为本地WAV文件,同时生成的音乐被切断,显然在此过程中会丢失一些数据如何在Java中从字节数组编写WAV文件,java,Java,我想开发一个简单的java音乐播放器,使用这个Sonic算法来加速和播放音乐。这是主类:。java只是调用Sonic.java,然后它就可以播放音乐了。尽管它在运行WAV文件时工作得很好,但我想要的是从加速的输入流中编写一个新的WAV文件 我尝试在Main.java的do while循环中将字节写入ByteArrayOutputStream,并将它们转换为本地WAV文件,同时生成的音乐被切断,显然在此过程中会丢失一些数据 public class App { private static vo
public class App {
private static void runSonic(
AudioInputStream audioStream,
SourceDataLine line,
float speed,
float pitch,
float rate,
float volume,
boolean emulateChordPitch,
int quality,
int sampleRate,
int numChannels) throws IOException
{
Sonic sonic = new Sonic(sampleRate, numChannels);
int bufferSize = line.getBufferSize();
byte inBuffer[] = new byte[bufferSize];
byte outBuffer[] = new byte[bufferSize];
int numRead,numWritten;
AudioFormat af = audioStream.getFormat();
ByteArrayOutputStream output = new ByteArrayOutputStream();
sonic.setSpeed(speed);
sonic.setPitch(pitch);
sonic.setRate(rate);
sonic.setVolume(volume);
sonic.setChordPitch(emulateChordPitch);
sonic.setQuality(quality);
int count = 0;
do {
numRead = audioStream.read(inBuffer, 0, bufferSize);
if(numRead <= 0) {
sonic.flushStream();
} else {
sonic.writeBytesToStream(inBuffer, numRead);
}
do {
numWritten = sonic.readBytesFromStream(outBuffer, bufferSize);
if(numWritten > 0) {
line.write(outBuffer, 0, numWritten);
output.write(outBuffer);
}
} while(numWritten > 0);
} while(numRead > 0);
byte fileBuffer[] = output.toByteArray();
ByteArrayInputStream bais1 = new ByteArrayInputStream(fileBuffer);
AudioInputStream aisAccelerated1 =
new AudioInputStream(bais1, af, fileBuffer.length);
try {
AudioSystem.write(aisAccelerated1, AudioFileFormat.Type.WAVE, new
File("newFile.wav")
);
}
catch(Exception e) {
e.printStackTrace();
}
}
public static void main(
String[] argv) throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
float speed = 1.5f;
float pitch = 1.5f;
float rate = 1.0f;
float volume = 1.0f;
boolean emulateChordPitch = false;
int quality = 0;
String fileName = "file.wav";
AudioInputStream stream = AudioSystem.getAudioInputStream(new File(fileName));
AudioFormat format = stream.getFormat();
int sampleRate = (int)format.getSampleRate();
int numChannels = format.getChannels();
SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format,
((int)stream.getFrameLength()*format.getFrameSize()));
SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
line.open(stream.getFormat());
line.start();
runSonic(stream, line, speed, pitch, rate, volume, emulateChordPitch, quality,
sampleRate, numChannels);
line.drain();
line.stop();
}
公共类应用程序{
私有静态无效runSonic(
音频输入流音频流,
源数据线,
浮动速度,
浮球,
浮动汇率,
浮动量,
布尔音高,
国际质量,
int采样器,
int numChannels)引发IOException
{
Sonic Sonic=新的Sonic(采样器、数字通道);
int bufferSize=line.getBufferSize();
字节inBuffer[]=新字节[bufferSize];
字节溢出器[]=新字节[bufferSize];
int numRead,numwrited;
AudioFormat af=audioStream.getFormat();
ByteArrayOutputStream输出=新建ByteArrayOutputStream();
音速设置速度(速度);
音速设定音高(音高);
声波凝固速率(速率);
音速设定音量(音量);
sonic.setChordPitch(模拟回声音高);
音质;
整数计数=0;
做{
numRead=audioStream.read(inBuffer,0,bufferSize);
if(numRead 0){
行写入(突发,0,numwrited);
输出。写入(突发);
}
}而(numwrited>0);
}而(numRead>0);
byte fileBuffer[]=output.toByteArray();
ByteArrayInputStream bais1=新的ByteArrayInputStream(文件缓冲区);
音频输入流已加速1=
新的音频输入流(bais1,af,fileBuffer.length);
试一试{
AudioSystem.write(AISCAlerated1,AudioFileFormat.Type.WAVE,新版本
文件(“newFile.wav”)
);
}
捕获(例外e){
e、 printStackTrace();
}
}
公共静态真空总管(
字符串[]argv)引发不支持的DaudioFileException、IOException、LineUnavailableException
{
浮动速度=1.5f;
浮动节距=1.5f;
浮动率=1.0f;
浮子体积=1.0f;
布尔值=假;
int-quality=0;
字符串fileName=“file.wav”;
AudioInputStream=AudioSystem.getAudioInputStream(新文件(文件名));
AudioFormat=stream.getFormat();
int sampleRate=(int)format.getSampleRate();
int numChannels=format.getChannels();
SourceDataLine.Info=newdataline.Info(SourceDataLine.class,format,
((int)stream.getFrameLength()*format.getFrameSize());
SourceDataLine=(SourceDataLine)AudioSystem.getLine(info);
line.open(stream.getFormat());
line.start();
runSonic(流、线、速度、音高、速率、音量、音高、质量、,
取样器,数字通道);
line.drain();
line.stop();
}
}
谁能告诉我这里发生了什么?我认为存储在Exputffer中的所有字节都是以这种方式写入输出流的
您可以使用上面的链接找到整个类
output.write(outBuffer);
问题就在这里。应该是
output.write(outBuffer, 0, numWritten);
您正在向输出写入垃圾。请提供问题中的所有相关代码,而不是通过链接。如果代码太多,试着缩小范围。这可能会有帮助:谢谢你,它现在演奏得很好!