JAVA按顺序播放多个wav音频

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

            List<String> files = new ArrayList<String>();
            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<String> files = new ArrayList<String>();
            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();
                }
            }

  

Java 中,音频数据通常是以字节流的形式存在的,如果你想将一段音频切分为多个 WAV 文件保存,可以按照以下步骤操作: 1. **音频处理库**: 首先,你需要一个音频处理库,比如 JFAPY、JAVE 或者 Commons-Math3 等,它们提供了读取和处理音频数据的功能。 2. **音频读取**: 使用库中的方法读取整个音频文件到一个大数组中,如 `byte[] audioData`。 3. **分割音频**: 定义每个小段的长度,然后计算能从原始数组切分出多少个这样的片段。例如,假设你想每秒切成一个片段,那么需要知道音频的采样率和帧大小(通常是每秒有多少个样本)。 4. **创建 Wav 文件**: 对于每一个小段,你可以使用 javax.sound.sampled 包中的 AudioFileWriter 类来创建一个新的 WAV 文件。首先,创建一个 AudioInputStream 用于存储切片数据,然后写入到新文件中。 5. **数据截取与写入**: 使用循环,每次从原始数组中提取指定长度的数据作为新的小段,并写入到 AudioInputStream 中。记得关闭所有资源,包括输入流和输出流。 6. **保存文件**: 调用 AudioFileWriter 的 write() 方法并将音频数据写入到新文件中,最后记得关闭 AudioFileWriter。 ```java AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("original.wav")); int frameSize = inputStream.getFrameSize(); int segmentLength = ...; // 每个小段的样本数 byte[][] segments = new byte[segmentLength][]; while (inputStream.available() > 0) { int read = inputStream.read(segments); if (read == -1) break; saveSegmentToWAV(segments, read, "slice_" + index + ".wav"); } private void saveSegmentToWAV(byte[] segment, int length, String filename) { try (AudioOutputStream outputStream = AudioSystem.getAudioOutputStream(new File(filename))) { AudioUtils.writeBytes(outputStream, segment, AudioFormat.Encoding.PCM_SIGNED); } catch (Exception e) { System.err.println("Error saving wav file: " + e.getMessage()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值