Windows 7上Java支持的任何声音格式?

 mobiledu2502860983 发布于 2023-02-06 10:47

我们,我一直在试图让Java播放一些简单的wav文件,而没有任何运气.我试过这段代码:

Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(soundBytes));
clip.open(inputStream);
clip.start();

对于带有异常的"clip.open(...)",此操作失败:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.

我尝试过更复杂的(流媒体版):

int BUFFER_SIZE = 128000;
AudioInputStream audioStream = null;
AudioFormat audioFormat;
SourceDataLine sourceLine = null;

try {
    audioStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(soundBytes));
} catch (Exception e){
    e.printStackTrace();
}

audioFormat = audioStream.getFormat();

DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
try {
    sourceLine = (SourceDataLine) AudioSystem.getLine(info);
    sourceLine.open(audioFormat);
} catch (LineUnavailableException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}

sourceLine.start();

int nBytesRead = 0;
byte[] abData = new byte[BUFFER_SIZE];
while (nBytesRead != -1) {
    try {
        nBytesRead = audioStream.read(abData, 0, abData.length);
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (nBytesRead >= 0) {
       @SuppressWarnings("unused")
       int nBytesWritten = sourceLine.write(abData, 0, nBytesRead);
    }
}

sourceLine.drain();
sourceLine.close();

对于带有异常的"sourceLine.open(...)",这也失败了:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.

我尝试了两种不同的wav文件,包括C:\ Windows\Media中的古老"tada.wav".

我还使用GoldWave将其中一个文件更改为无符号8位单声道,但这只是将错误消息更改为:

javax.sound.sampled.LineUnavailableException: line with format PCM_UNSIGNED 44100.0 Hz, 8 bit, mono, 1 bytes/frame,  not supported.

关于我可能出错的地方的任何想法?看起来像播放一个简单的波形文件应该很简单,所以我猜我已经在杂草的某个地方了.

提前致谢.

UPDATE

所以,情节变浓了.如果我们将它移动到一个单独的独立java程序中,代码工作正常.我们的应用程序中的某些东西必须是烹饪Java播放声音的能力.

以下是上述错误的堆栈跟踪:

javax.sound.sampled.LineUnavailableException: line with format PCM_UNSIGNED 44100.0 Hz, 8 bit, mono, 1 bytes/frame,  not supported.
at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:492)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:107)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:139)
at com.hcs.orc.detail.SoundAddEdit.playButtonActionPerformed(SoundAddEdit.java:315)
at com.hcs.orc.detail.SoundAddEdit.access$100(SoundAddEdit.java:40)
at com.hcs.orc.detail.SoundAddEdit$2.actionPerformed(SoundAddEdit.java:225)

更新2

更有趣的发现.加载DLL时似乎有冲突.我们有自己的DLL来帮助我们做事(例如找到可靠和可用的MAC地址).如果你在加载我们的DLL之前播放声音(加载声音相关的DLL),那么两者都有效.但是,如果你我们的DLL然后尝试播放声音,声音会给你上面报告的错误.

任何人都有任何洞察为什么一个看似无关的DLL会导致另一个DLL以后加载错误?

作为一个真正蹩脚和糟糕的解决方案的入口,我们可以在启动之前在查找MAC地址时播放一小段时间的静音.这是一种糟糕的形式,原因有很多,包括许多客户根本不使用声音.

更新3

进入我们的库,似乎问题是由RegisterClassEx(...)调用引起的.我们这样做,因此我们可以使用HTML帮助文件显示嵌入式IE窗口.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有