java代码按顺序播放音频_JAVA按顺序播放多个wav音频

在Java中按顺序播放多个音频文件时遇到服务器上IOException:mark/reset not supported的问题。通过在InputStream上添加BufferedInputStream进行封装,解决了该问题。修改后的代码能够正确播放每个音频文件,等待缓冲区清空后再关闭数据线。
摘要由CSDN通过智能技术生成

用Java按顺序播放多个音频部件,不是同时播放。代码如下:

List files = new ArrayList();

files.add("barcode_prefix.wav");

for (char letter : barcode.toCharArray())

{

files.add(letter + ".wav");

}

files.add("barcode_suffix.wav");

byte[] buffer = new byte[4096];

for (String file : files)

{

try

{

AudioInputStream is = AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(file));

AudioFormat format = is.getFormat();

SourceDataLine line = AudioSystem.getSourceDataLine(format);

line.open(format);

line.start();

while (is.available() > 0)

{

int len = is.read(buffer);

line.write(buffer, 0, len);

}

line.drain(); // **[DEIT]** wait for the buffer to empty before closing the line

line.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

这个我在本地播放没有问题,放到服务器上会报错:

java.io.IOException: mark/reset not supported

at java.util.zip.InflaterInputStream.reset(Unknown Source)

at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source)

at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)

at com.yulong.mes.winapp.form.quality.ForBatchOperationForm$PlayAudioRunnable.run(ForBatchOperationForm.java:4317)

at java.lang.Thread.run(Unknown Source)

网上说要用BufferedInputStream封装一下。修改下代码确实如此:

List files = new ArrayList();

files.add("barcode_prefix.wav");

for (char letter : barcode.toCharArray())

{

files.add(letter + ".wav");

}

files.add("barcode_suffix.wav");

byte[] buffer = new byte[4096];

for (String file : files)

{

try

{

InputStream stream = this.getClass().getResourceAsStream(file);

InputStream bufferedIn = new BufferedInputStream(stream);

AudioInputStream is = AudioSystem.getAudioInputStream(bufferedIn);

AudioFormat format = is.getFormat();

SourceDataLine line = AudioSystem.getSourceDataLine(format);

line.open(format);

line.start();

while (is.available() > 0)

{

int len = is.read(buffer);

line.write(buffer, 0, len);

}

line.drain(); // **[DEIT]** wait for the buffer to empty before closing the line

line.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

原文:http://www.cnblogs.com/foxting/p/7207411.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值