- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们会的,我一直在用头撞墙试图让 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.
关于我可能哪里出错的任何想法?似乎播放一个简单的 wave 文件应该很简单,所以我猜我在某个地方迷路了。
提前致谢。
更新
所以,情节变厚了。如果我们将它移到一个单独的独立 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 窗口。
最佳答案
我以前遇到过类似的问题(尽管与加载 DLL 无关。)Javasound 通过使用 1 个或多个混音器在底层工作,每个混音器有 1 行或多行。这些行中的每一行都有许多它说它支持的格式,但这并不意味着它在播放该格式时不会自发燃烧(本质上,没有什么能阻止它吹嘘播放它不能播放的格式。)
当您使用 AudioSystem.getLine()
时,它将遍历所有这些混音器的所有这些行,并基本上返回它遇到的第一个表示它可以处理该格式的行。如果该行是一个大骗子,那么它就不会寻找其他行 - 它只会随之而来并产生您所看到的错误。
现在这里要记住的重要一点是它在这些行上迭代的顺序是完全任意的。所以任何事情都可能导致它发生变化,包括看似无关紧要的事情,例如加载 DLL。我可以在这里看到两种可能性之一,DLL 以某种方式提供了导致问题的另一条音频线路,或者加载 DLL 只会导致任意顺序发生变化,当您这样做时,由于某种原因它首先遇到可疑线路。
解决方法并不好,但比播放声音并稍等片刻要好,您基本上必须测试线路以查看它是否在说真话:
SourceDataLine dataline = null;
for (Mixer.Info mixerInfo : AudioSystem.getMixerInfo()) {
try {
Mixer mixer = AudioSystem.getMixer(mixerInfo);
dataline = (SourceDataLine)mixer.getLine(info);
if(dataline==null) {
continue; //Doesn't support this format
}
dataline.open(audioFormat);
dataline.start();
}
catch (Exception ex) {
//If we get here it's a buggered line, so loop round again
continue;
}
try {
dataline.close();
}
catch (Exception ex) {
ex.printStackTrace(); //Shouldn't get here
}
}
if(dataline==null) {
//No dataline capable of *really* playing the stream
}
else {
//We have a non-lying dataline!
}
这种方式需要更长的时间,但它本质上是双重检查 - 我们遍历每条数据线,如果它说它可以播放格式,我们检查它是否真的可以 - 并且只在那种情况下,我们会确定它是否可以安全使用。
关于java - Windows 7 上的 Java 是否支持任何声音格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959838/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!