问题标签 [javax.sound.sampled]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
291 浏览

kotlin - 为什么 Java Sound Clip 在暂停和恢复后不发送 LineListener 事件?

我在 Kotlin 中有一个简单的音频测试程序,它使用Clip

我的音频文件长 1.1 秒。我希望这个程序播放文件的前 0.5 秒,暂停 1 秒,然后播放完文件。当播放开始时,我希望收到一个STARTLineListener 事件,当播放停止/暂停时,我希望收到一个STOPLineListener 事件。我还希望START在取消暂停剪辑时收到另一个事件,并在STOP到达文件末尾时收到最终事件。但是,我的输出看起来像:

我可以听到音频文件按预期停止、暂停和完成播放,但在重新启动剪辑后我没有收到任何 LineListener 事件。如果我不暂停并重新启动剪辑,我会正确收到文件结束STOP事件。

为什么我在恢复剪辑后看不到任何 LineListener 事件?

编辑:

如果我添加这一行

紧随其后clip.stop()Thread.sleep(1000)问题消失, LineListener 收到预期的事件:

这是 Clip 实现中的错误吗?

0 投票
1 回答
119 浏览

java - 用 Java 播放奇异的 WAV 文件

我有一个用 ADPCM(id=2)、单声道、每个样本 4 位和一个“事实”块编码的 WAV 文件。许多没有出现在“正常”wav 中的东西。

AudioInputStream 的 AudioFileReader 类在解析格式代码时已经失败(这里是 2 == ADPCM),它只接受 1,3,6 和 7。

还有其他方法可以播放此类文件吗?由于标准 Java 显然无法做到这一点。

这是文件:https ://anonfile.com/c1ianfj5b5/music_wav

0 投票
0 回答
17 浏览

java-8 - 我在可执行文件中找不到声音文件夹,但如果在 IDE 中找到它

我有一个脚本在创建.exe. 另一方面,在 IDE 中,它.wav可以毫无问题地找到文件。

我的声音文件夹与源文件夹位于同一级别。我在 IDE 中没有错误。

会是什么?

0 投票
1 回答
1137 浏览

java - 在 JVM 内长时间录制音频时突然延迟

我正在实现一个应用程序,它使用 JDK 版本 8 更新 201 实时(或至少尽可能接近实时)记录和分析音频。在执行模拟应用程序典型用例的测试时,我注意到在连续录制音频几个小时后,突然出现一到两秒的延迟。到目前为止,没有明显的延迟。只有在这个关键的记录点持续了几个小时之后,才开始出现这种延迟。

到目前为止我尝试过的

为了检查我的音频样本录制时间代码是否错误,我注释掉了与时间相关的所有内容。这基本上让我有了这个更新循环,它在音频样本准备好后立即获取它们(注意:Kotlin 代码):

这是我的阅读方法:

然而,即使我没有任何时间,问题也没有得到解决。因此,我继续进行了一些实验,让应用程序使用不同的音频格式运行,这导致了非常混乱的结果(我将使用 PCM 签名的 16 位立体声音频格式,小端序和 44100.0 Hz 的采样率默认情况下,除非另有说明):

  1. 在延迟出现之前必须经过的关键时间量似乎因所使用的机器而异。在我的 Windows 10 台式电脑上,它大约需要 6.5 到 7 个小时。但是,在我的笔记本电脑(也使用 Windows 10)上,相同的音频格式需要 4 到 5 个小时。
  2. 使用的音频通道数量似乎有影响。如果我将声道数量从立体声更改为单声道,延迟开始出现之前的时间会翻倍,在我的桌面上达到 13 到 13.5 小时之间。
  3. 将样本大小从 16 位减少到 8 位也会导致延迟开始出现之前的时间加倍。在我的桌面上大约需要 13 到 13.5 个小时。
  4. 将字节顺序从 little endian 更改为 big endian 无效。
  5. 从立体声混音切换到物理麦克风也没有效果。
  6. 我尝试使用不同的缓冲区大小(1024、2048 和 3072 样本帧)及其默认缓冲区大小来打开该行。这也没有改变什么。
  7. 在延迟开始发生后刷新TargetDataLine会导致所有字节在大约一到两秒内为零。在此之后,我再次获得非零值。然而,延迟仍然存在。如果我在临界点之前刷新该行,我不会得到那些零字节。
  8. 在出现延迟后停止和重新启动 TargetDataLine也不会改变任何内容。
  9. 但是,关闭并重新打开 TargetDataLine 确实可以消除延迟,直到它在几个小时后重新出现。
  10. 每十分钟自动刷新 TargetDataLines 内部缓冲区无助于解决问题。因此,内部缓冲区中的缓冲区溢出似乎不是原因。
  11. 使用并行垃圾收集器来避免应用程序冻结也无济于事。
  12. 使用的采样率似乎很重要。如果我将采样率加倍至 88200 赫兹,则延迟开始出现在运行时间 3 到 3.5 小时之间。
  13. 如果我让它使用我的“默认”音频格式在 Linux 下运行,它在运行大约 9 小时后仍然可以正常运行。

我得出的结论:

这些结果让我得出结论,在此问题开始发生之前我可以录制音频的时间取决于运行应用程序的机器以及取决于音频格式。这似乎保持正确(尽管我现在还不能完全确认这一点),因为如果我结合 2 和 3 中所做的更改,我会假设我可以录制音频样本的时间是原来的四倍(介于 26 和27 小时),就像在延迟开始出现之前使用我的“默认”音频格式一样。由于我还没有时间让应用程序运行这么长时间,我只能说它确实运行了大约 15 个小时,然后由于我身边的时间限制而不得不停止它。因此,这一假设仍有待证实或否定。

根据要点 13 的结果,似乎整个问题仅在使用 Windows 时出现。因此,我认为可能是 javax.sound.sampled API 的平台特定部分中的错误。

即使我认为当这个问题开始发生时我可能已经找到了改变的方法,但我对结果并不满意。我可以定期关闭并重新打开线路,以避免问题开始出现。但是,这样做会导致我无法捕获音频样本的任意少量时间。此外,Javadoc 声明某些行在关闭后根本无法重新打开。因此,就我而言,这不是一个好的解决方案。

理想情况下,这整个问题根本不应该发生。是否有一些我完全遗漏的东西,或者我是否遇到了 javax.sound.sampled API 的限制?我怎样才能完全摆脱这个问题?

编辑:根据 Xtreme Biker 和 gidds 的建议,我创建了一个小示例应用程序。你可以在这个Github 存储库中找到它。

0 投票
2 回答
349 浏览

java - 是否有一致的方法来跟踪 Java 中剪辑(或音频文件)中的位置?

我正在尝试用 Java 编写节奏游戏。我正在播放带有 a 的音频文件,javax.sound.sampled.Clip我想知道我所在的确切位置。

根据我的研究,节奏游戏的一个好习惯是使用音乐播放中的位置而不是系统时间来跟踪时间(以避免音频和游戏之间的转换)。

System.nanoTime()我已经编写了一个用于保持一致帧速率的主循环。但是当我尝试获取剪辑的时间时,我有几帧返回相同的时间。这是我的代码的摘录:

我期待一个一致的输出(120 fps 的每帧增量约为 8,333 µs),但我在几帧中得到了相同的时间。

控制台返回:

我怎样才能始终如一地准确地跟踪我在歌曲中的位置?javax Clip 有什么替代品吗?

0 投票
0 回答
21 浏览

java - 无法资助文件位置

我正在尝试播放 .wav 文件,但由于某种原因,我总是收到找不到错误的错误。下面是我的代码:

我不得不使用相关路径调用该文件,因为该程序将交给我的老师。而且我已经尝试了很多次,但音乐文件仍然无法播放。请帮忙。

0 投票
0 回答
139 浏览

java - 在 Java、Windows 10 中控制外部 USB 声卡上的 8 声道环绕声

摘要:当我无法通过 Java 中的 javax.sound.sampled Sound API 找到它们时,如何访问外部 USB 音频声卡上的所有 8 个环绕声道,但底层 Windows 10 可以使用它们?我需要一种策略来从 Java 中访问所有 8 个通道,即使它需要操作系统中的其他驱动程序/软件(我已经尝试过 Windows 库存驱动程序和 C-Media 驱动程序。)

加长版:我有一个 C-Media 外部 USB 音频声卡。当我使用 java 声音 API 列出(Windows 10)系统上的混音器时,我可以在外部卡上看到扬声器的混音器,它们适用于立体声:

Mixer: Direct Audio Device: DirectSound Playback [Speakers (USB Sound Device)]

当我以编程方式列出支持的 SourceDataLine 格式时,我看到了单声道和立体声选项。

但是该卡支持环绕声 7.1,并且 Windows 10 系统能够向卡上的所有 8 个通道播放样本声音:前/后/侧/中/子。

所以我的问题是如何找到他们?我已经查看了 XTAudio 和 Jack,但是要找出花时间从 Java 中访问全部 8 个通道的选项非常耗时。

另外:当我在 OSX Catalina 上列出支持的混音器格式时,支持的格式有 8 个通道,效果很好,但我无法在 Windows 10 上获得这些格式:

0 投票
0 回答
492 浏览

java - Java:实时处理来自扬声器的音频

我正在开发一个项目,该项目将根据输出声级通过 PWM 信号改变键盘灯的亮度。那个麻烦是,我需要实时的输出流。到目前为止,我使用了 javax.sound.sampled 包,但从未成功获取音频输出。但是,我所做的是使用 targetDataLine 和 sourceDataLine,这看起来不像要走的路,但我仍在尝试。我需要的是一个音频流提供程序,我的 java 应用程序可以“听到”并处理它。到目前为止,我查看了许多教程、视频、帖子、一些文章(例如:https ://cr.openjdk.java.net/~iris/se/12/latestSpec/api/java.desktop/javax/sound/采样/类使用/Mixer.Info.html) 等,但没有结果。以前有人做过吗?或者除了采样库之外还有其他图书馆吗?任何帮助,将不胜感激。

我得到的每种格式的错误:

使用的代码:

最近,我一直在寻找一些代码来发现可用的格式,并且我在我的代码和edoloughlin的代码之间做了一些事情:

如上所示,我使用了许多格式组合,但在控制台中没有打印出任何内容。我想知道我的系统/java 应用程序是否支持这样的任务。如果没有,有没有办法实现目标?(读取实时输出)

0 投票
1 回答
305 浏览

java - .wav 文件中的原始数据是什么意思?

所以我试图从 .wav 文件中提取不同样本的幅度,以便能够根据时间重建波形。在研究 .wav 文件的格式时,我发现了一些非常有用的信息。但是,当涉及到原始数据部分时,我感到很困惑。我发现的文章说,“在 16 位 PCM 的情况下,16 位样本存储为 2 的补码无符号整数,范围从 0 到 65535”。我很困惑,因为如果文件没有符号,我不知道文件如何区分正幅度和负幅度。例如,如果一个幅度为 5,表示为二进制的 00000000 00000101,则使用 2 的补码 -5 应表示为 11111111 11111011,即 65531 的十进制整数。这让我认为 -5 的幅度被认为比 +5 幅度大得多。显然这不是它的工作方式,所以我做错了什么?此外,当我将 .wav 文件保存到二进制数组并输出值时,我得到负数!如果文章说只应该存储 0 到 65535 之间的值,那么这些负数是从哪里来的。只是很困惑,真的需要把事情弄清楚。我所指的文章的链接附在下面。作者所说的引文位于页面的最底部。谢谢。

http://www.ievs.ch/projects/var/upload/Documentation%20Microsoft%20Wave%20File%20Format.pdf

0 投票
1 回答
35 浏览

java - 一次从我的循环播放音频而不停止循环的其余部分

假设我有一个主要的 GameLoop

在这个循环中,我有我的游戏更新

我正在处理我的事件以进行每次迭代的 Sprite 碰撞测试

如果碰撞为真,播放音频文件

这是问题发生的地方

音频剪辑将在游戏冻结时快速播放

或者

它会像我想要的那样延迟播放,但除了音频剪辑之外,整个游戏都会停止。

我只是在寻找一些关于线程基本的技巧。据我所知,这将是处理此问题的最佳方法,但我似乎无法使其正常运行。

注意我会在主类上扩展线程,但已经扩展了 Canvas,需要。

这是实际的 Sound.class

我已经尝试过以下相同的情况(通过 s.start() 和 s.run() 调用它没有区别)使用 .start() 会在线程中抛出错误,将重新创建真正的快速并共享)

抛出控制台“java.lang.IllegalThreadStateException”调用 start() 仅在此对象内部定义 run()

在此处输入图像描述 注意自我。不要那样做。

以错误的方式进行多线程主要示例 243 max 线程在任何时候都在那里