簡體   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