繁体   English   中英

在Java中以96Khz和更高的采样率播放音频

[英]Playing audio with sampling rate 96Khz and up in Java

我的系统具有能够播放24/96和24/192格式的USB DAC,但是当我尝试使用Java播放它们时,却遇到了线路不可用的异常。 因此,对于Java声音文档,Java对采样率和比特率没有任何限制,而对于下划线声音系统来说,这些限制即将到来。 所以我找到了异常的来源,它看起来像本机函数

 private static native void nGetFormats(int mixerIndex, int deviceID,
                                       boolean isSource, Vector formats);

不会使用16/48以上的相应行信息填充格式。 我在这里查看了消息来源。

但是,要证明该函数确实不会返回我需要的格式,或者只是返回略有不同的格式,我必须查看实际的格式列表。 但我不知道如何达到目标。 DirectDL的方法是私有的:

 private AudioFormat[] getHardwareFormats() {
          return hardwareFormats;
 }

所以我的问题分为两部分:

  1. 我如何仍能获取Java从硬件获得的受支持格式的列表? 在这种情况下,我可以编写自己的DirectAudioDevice。

  2. 除了标准Java声音之外,还有其他方法可以管理Java更高的采样率吗? 例如Tritonus,但它看起来确实很旧,不受支持。

我在Window上进行了测试,因此计划在Linux上使用不同于Oracle JRE的方式重复进行测试。 但是无论如何我都需要找到可移植的解决方案。

我找到了一些解决方案,因此可以使用Java以FLAC,APE和Wavpack格式收听24 / 96Khz和24 / 192Khz录音。 在用Java声音进行一些调试之后,我发现由于某种原因Java运行时将位深度限制为16位,但是可以接受高采样率,例如96Khz和192KHz。 因此,我从MediaChest借来了采样解决方案。 我还得到了JustFLAC,它为FLAC文件提供24/192支持。 如果不更新我计划很快做的Java运行时本机库,似乎不可能直接通过硬件支持24/192。

编辑:最新更新是:我在本机Java运行时中找到以下内容:

 static INT32 bitsArray[] = { 8, 16};
 ....
 #define BITS_COUNT sizeof(bitsArray)/sizeof(INT32)
 ....
     for (rateIndex = 0; rateIndex < SAMPLERATE_COUNT; rateIndex++) {
    for (channelIndex = 0; channelIndex < CHANNELS_COUNT; channelIndex++) {
        for (bitIndex = 0; bitIndex < BITS_COUNT; bitIndex++) {
            DAUDIO_AddAudioFormat(creator, bitsArray[bitIndex],

如您所见,8位和16位被硬编码并用于支持的格式矩阵生成。 只需添加两个常量,修复似乎很容易,但是它导致创建自己的Java运行时副本,因此是不可接受的。 因此,看来我需要启动一些社区流程以使我的建议被下次Java运行时更新接受并包含在其中。

编辑:另一个更新。 Linux声音本机实现似乎更好。 它仅具有24位样本大小的限制。 因此,如果下划线音响系统(ALSA)允许采样深度,则Java可以播放24位/ 192,000格式。 我使用最新的Raspbian和JDK 8 EA在Raspberry Pi上进行了测试。 不幸的是,即使是最新的Arch和Pidora也没有对ALSA进行改进。

要在私有字段中读取和写入值,可以使用反射。 Java教程和StackOverflow中的一个问题

关于您的第二个问题,我发现了一个名为jd3lib的库,该库似乎很新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM