Воспроизведение Java 24-битного звука неверна

StackOverflow https://stackoverflow.com/questions/3024622

  •  26-09-2019
  •  | 
  •  

Вопрос

Я использую Javax Sound API для реализации простой программы воспроизведения консоли на основе http://www.jsresources.org/examples/audioPlayer.html..

Испытав его с помощью 24-битного файла рампы (каждый образец - последний образец плюс 1 в течение полного 24-битного диапазона). Очевидно, что что-то странное происходит во время воспроизведения. Записанный выход не является содержимым файла (у меня есть цифровой обратную связь, чтобы проверить это).

Похоже, каким-то образом неверно истолковывает образцы, что приводит к тому, что левый канал выглядит так, как будто он применил к нему некоторое усиление, и правильный канал выглядит так, как будто он ослабляется.

Я изучал, нуждается ли настройка Pan и Balance Controls, но они не доступны, и я проверил настройки звуковой системы Windows XP. Любая другая форма воспроизведения этого файла рампы в порядке.

Если я сделаю тот же тест с 16-битным файлом, он правильно выполняет без повреждения потока.

Так у кого-нибудь есть идея, почему API Java Sound изменяет мой аудиопоток?

Это было полезно?

Решение

Проблема с воспроизведением Java 24-битного звука на самом деле с Microsoft Directsound и / или Windows Java Sound Resultave из него. Использование Linux с Java Sound и ALSA, 24-битный аудио воспроизводится идеально (запись вывода показывает идеальное совпадение с входным файлом).

Чтобы понять, почему он не работает в Windows, вы можете запросить поддерживаемые аудио форматы вывода строки, которые вы хотите воспроизвести в Java, используя (где lineInfo это Line.Info из выходной линии):

DataLine.Info dataLineInfo = (DataLine.Info) lineInfo;

а затем зацикливаться через поддерживаемые форматы:

for (AudioFormat lineFormat : dataLineInfo.getFormats())

Для Windows я получаю что-то вроде:

Format #1: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #2: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #3: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #5: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #6: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #7: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian

Который не имеет 24 бита в качестве поддерживаемого формата. Но в Windows XP она все еще позвольте мне сыграть 24-битный аудио, но, по-видимому, обрабатывается до 16 бит Java / Directsound, а затем обратно до 24 бит на SoundCard. Следовательно, почему выход данных неверный. В Windows 7 я обнаружил, что он просто отказался играть 24-битный аудио (вероятно, более разумно, если все это будет делать, это упасть на 16 бит).

Для Linux (Fedora 17) я получаю что-то вроде (с той же самой звуковой картой, ESI Juli @, на том же компьютере):

Format #1: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, little-endian
Format #2: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, big-endian
Format #3: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, big-endian
Format #5: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, little-endian
Format #6: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, big-endian
Format #7: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, big-endian
Format #9: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
Format #10: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
Format #11: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
Format #12: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
Format #13: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, little-endian
Format #14: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, big-endian
Format #15: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, little-endian
Format #16: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, big-endian
Format #17: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #18: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #19: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #20: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Format #21: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #22: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #23: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #24: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 

Который имеет 24 бита в качестве поддерживаемого формата. И как таковые это работает как ожидалось и без нежелательной дополнительной обработки.

Так что кажется, что 24-битное воспроизведение работает с Java Sound, при условии, что ОС-специфическая (и, возможно, конкретная, но я не нашел никаких изменений между устройствами, которые я пробовал до сих пор). Реализация его списки Поддерживаемый аудиоформат. Мои тесты предполагают, что Linux (ALSA) поддерживает его, тогда как Windows (Directsound) не делает.

Надеюсь, это полезно для кого-то; Я не мог найти ничего другого об этом онлайн, поэтому я разместил на такой старый вопрос.

Ниже приведен мой первоначальный вопрос, который я только что ответил (я оставил его для справки):


Я не уверен, что это правильная процедура для удаления старых вопросов, но от чтения FAQ выглядит так, что это предпочтительно для публикации нового. Я уже опубликовал эту проблему на пару других мест (включая Oracle Java Sound Forum), но без ответов, и этот вопрос звучит точно так же, как проблема, у меня есть:

Я использую Java Sound, чтобы воспроизводить аудиофайлы (в стандартном формате PCM), но я заметил, что он не правильно воспроизводится 24-битных данных, в том, что вывод данных из SoundCard не соответствует входу из файла. Он работает нормально для 16-битных (и даже 8-битных) аудиоданных, но не для 24-битных (и предположительно 32 бита, но у меня нет реальных 32 битных аудиофайлов для тестирования) файлов. С вывода появляется, что звук Java выполняет дополнительную (и ненужную) обработку для аудиоданных, прежде чем передавать его на звуковую карту. Я могу сказать наверняка, что это Java Sound делает это, потому что, если я запускаю тот же тест, используя ASIO, чтобы воспроизвести файл, то нет проблем и совпадения данных, как и ожидалось.

Немного больше информации о настройке: - Java Jre Последняя версия (7U7 Я думаю), работает на Windows XP SP3. - Звук, воспроизводимый с использованием примера аудиопладжера (как упоминалось в главном вопросе) на jsresources.org (я в первую очередь попробовал использовать свой собственный код, но переключился на это в случае ошибки, результаты одинаковы на обоих). - звук воспроизводится на M-Audio SoundCard через цифровой (S / PDif), который напрямую подключен (через внешний кабель) на цифровой в цифровой звуковой карте (на том же ПК), где это записано (используя Sony Sound Forge). - Записанный файл затем сравнивается со входным волновым файлом.

Для теста используются четыре различных файла ввода волны (сгенерированы из одного и того же исходного файла): - 16 бит, 44,1 кГц; - 16 бит, 48 кГц; - 24 бит, 44,1 кГц; - 24 бит, 48 кГц.

Используя ASIO Для воспроизведения тестовых файлов, все четыре файлов создали правильный вывод (записанные данные совпадают на байте данных файла входных волн для байта, после того, как выравниваете начальные позиции на время нажатия на нажатие и нажав на воспроизведение.

Использование Java для воспроизведения тестовых файлов, 16-битные (как 44.1 кГц, так и 48 кГц) создают правильный выход, тогда как 24-битные (как 44,1 кГц, так и 48 кГц). Не только то, что, но способ, которым вывод неверный, является непоследовательным (если я запускаю тест два раза, он приносит другой выход каждый раз, ни один из которых не приближается к совпадению входного файла). Таким образом, Java Sound Sound играет в систему 24 битовых файла неправильно, он делает это так неверно по-другому. Если это поможет, я могу сделать скриншоты звукового вывода Java по сравнению с входным файлом (ожидаемый вывод).

Самый простой способ воспроизвести это было бы использовать пример аудиозаписи, упомянутого выше, воспроизведите 24-битный файл и записывать вывод (если у вас есть только одна звуковая карта, возможно, можно было бы использовать его миксер, чтобы получить соответствующие данные, чтобы он был захвачен). Хотя это недостаточно неправильно, что я могу услышать любую разницу, оно делает разницу цели аудио высокого разрешения, если данные изменяются в одном неожиданном виде (вы рискуете потерять любые выгоды от использования 24 бита за 16 бит, хотя я Не хочу войти в этот аргумент здесь).

Итак, чтобы фразу так как вопрос - как я могу правильно воспроизвести звук Java, чтобы вернуть 24-битный аудио?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top