java wav byte_如何用Java从字节数组中编写WAV文件

我想开发一个简单的java音乐播放器,使用这个Sonic算法来加速和播放音乐

github/Sonic.java

. 以下是主要课程:

github/Main.java

. Main.java只需调用Sonic.java就可以播放音乐。尽管它在运行WAV文件时运行良好,但我想要的是从加速的输入流中编写一个新的WAV文件。

我尝试在Main.java的do while循环中将字节写入ByteArrayOutputStream,并将它们转换为本地WAV文件,同时生成的音乐被切断,显然在此过程中有一些数据丢失。

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();

}

}

谁能告诉我这里发生了什么事?我认为outBuffer中存储的所有字节都是这样写入输出流的。

您可以使用上面的链接找到整个类。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要从WAV文件中提取声音数据,可以使用Java中的javax.sound.sampled库。以下是基本的步骤: 1. 使用AudioSystem类的getAudioInputStream()方法读取WAV文件并获取AudioInputStream对象。 2. 获取音频流的格式信息,可以使用AudioFormat类和AudioSystem类的getFormat()方法。 3. 使用AudioSystem类的read()方法将音频流读取到字节数组中。 下面是一个简单的示例代码,可以从WAV文件中提取声音数据: ``` import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; public class AudioExtractor { public static void main(String[] args) { try { // 读取WAV文件并获取音频流 File file = new File("sample.wav"); AudioInputStream audioStream = AudioSystem.getAudioInputStream(file); // 获取音频流的格式信息 AudioFormat format = audioStream.getFormat(); // 计算字节数组长度(每秒采样数 * 采样位数 / 8 * 通道数 * 持续时间) int length = (int) (audioStream.getFrameLength() * format.getFrameSize()); byte[] audioBytes = new byte[length]; // 读取音频流到字节数组中 int bytesRead = audioStream.read(audioBytes); // 输出字节数组长度 System.out.println("Read " + bytesRead + " bytes"); // 关闭音频流 audioStream.close(); } catch (UnsupportedAudioFileException | IOException e) { e.printStackTrace(); } } } ``` 注意:该示例代码仅适用于WAV文件,如果需要处理其他类型的音频文件,需要修改相应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值