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

  

时间: 2024-10-18 00:23:42

JAVA按顺序播放多个wav音频的相关文章

android开发:把一个byte数组转换成wav音频文件,并且播放

============问题描述============ 如题,byte数组转换成wav音频文件,并且播放,下面代码能生成data/data/com.example.playwav/cache/temp.wav 但是在播放的时候报异常. 我把代码和Log贴在下面了. 我分析,原因应该是wav文件格式的编解码问题,不能这么随随便便把任意的一个byte数组就转化为了wav 希望了解wav编解码开发的童鞋给点解决办法 byte[] a = { 52, 51, 48, 28, 58, 64, 98,-1

用 Qt 的 QAudioOutput 类播放 WAV 音频文件

用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件,那么 Qt 里简单的 QSound 类是最适合的.但是 QSound 有一个很大的缺陷就是无法选择用哪个声卡.一番研究之后,决定用 QAudioOutput 来播放 WAV 音频文件. 网上也能找到几篇相关的文章,比如: http://blog.csdn.net/qyee16/article/det

vc++播放wav音频文件

播放wav音频文件的方式:1.从vc++资源里读取音频文件,然后播放2.从硬盘,找到指定路径的音频文件,然后播放 代码实现:方式1: LPCTSTR lpstrWav = NULL; // IDR_WAVE1 是资源里音频文件的名称 lpstrWav = MAKEINTRESOURCE(IDR_WAVE1); // playsound第二个参数是获得当前应用程序的模块句柄. // playsound第三个参数添加参数SND_RESOURCE,指明声音来至程序的资源文件里 ::PlaySound(

用 Qt 的 QAudioOutput 类播放 WAV 音频文件(使用了libsndfile外部库)

用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件,那么 Qt 里简单的 QSound 类是最适合的.但是 QSound 有一个很大的缺陷就是无法选择用哪个声卡.一番研究之后,决定用 QAudioOutput 来播放 WAV 音频文件. 网上也能找到几篇相关的文章,比如: http://blog.csdn.net/qyee16/article/det

WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)

刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. DirectSound的使用步骤很简单 首先你要创建一个DirectSound8设备对象 1 HRESULT DirectSoundCreate8( 2 LPCGUID lpcGuidDevice, 3 LPDIRECTSOUND8 * ppDS8, 4 LPUNKNOWN pUnkOuter 5 )

Python 调用pyaudio库录制以及播放wav音频文件

1.Pyaudio简介 PyAudio 是语音处理的 Python 库,提供了比较丰富的功能. 2.功能 python的Pyaud模块可以调用电脑的麦克风或音响进行录音,音频播放,生成wav文件等. wave是录音是用的标准的WINDOWS文件格式,扩展名为WAV,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种. 3.Pyaudio安装 pip install pyaudio 推荐使用清华源哦,速度快 pip install pyaudio -i https://pypi.tuna.ts

HTML5 audio 如何实现播放多个MP3音频

<audio>标签是HTML5中的新标签,定义声音用于嵌入音频内容,比如音乐或其他音频流.用的比较多音频格式是.mp3. <audio>标签常用属性如下表 属性 值 描述 autoplay autoplay 添加该属性后,音频会自动播放 controls controls 设置后,显示控件,如播放按钮.音量 loop loop 添加该属性后,当音频播放结束后会重新开始播放 preload preload 音频显示页面加载,准备播放,如已添加autoplay,则忽略该属性 src u

使用JavaScript脚本控制媒体播放(顺序播放和随机播放)

在JavaScript脚本中获取<audio.../>元素对应的对象为HTMLAudioElement对象,<video.../>元素对应的对象为HTMLVideoElement对象. HTMLAudioElement对象和HTMLVideoElement对象支持的方法有如下几个: play():播放视频.音频 pause():暂停播放 load():重新装载音频.视频文件 canPlayType(type):判断该元素是否可以播放type类型的音频.视频.该属性指定该音频.视频文

Java初始化顺序

1.在类的内部,变量的定义的先后顺序决定了初始化顺序,即使变量定义散布于方法定义间,他们仍旧会在任何方法(包括构造器)被调用之前得到初始化 2.静态数据的初始化 class Bowl{ Bowl(int marker){ print("Bowl("+marker+")"); } void f1(int marker){ print("f1("+marker+")"); } class Table{ static Bowl bo