Java для обработки аудио это практично? - PullRequest
20 голосов
/ 02 января 2009

Является ли Java подходящей альтернативой C / C ++ для обработки звука в реальном времени?

Я рассматриваю приложение с ~ 100 (макс.) Дорожками аудио с линиями задержки (30 с при 48 кГц), фильтрацией (512 точек FIR?) И другими операциями типа DSP, выполняемыми на каждой дорожке одновременно.

Операции будут преобразованы и выполнены с плавающей запятой.

Система, вероятно, будет четырехъядерной 3GHz с 4 ГБ оперативной памяти, работающей под управлением Ubuntu.

Я видел статьи о том, что Java намного быстрее, чем раньше, приближается к C / C ++ и теперь имеет также расширения в реальном времени. Это реальность? Требуется ли жесткое кодирование и настройка ядра для достижения производительности% 50-% 100 C, о которой некоторые говорят?

Я действительно ищу смысл, если это возможно, и хедс-ап для любых ошибок.

Ответы [ 9 ]

19 голосов
/ 02 января 2009

Для аудио приложения у вас часто есть только очень маленькие части кода, на которые тратится большая часть времени.

В Java вы всегда можете использовать JNI (собственный интерфейс Java) и перенести свой тяжелый вычислительный код в C-модуль (или сборку с использованием SSE, если вам действительно нужна мощность). Так что я бы сказал, использовать Java и заставить ваш код работать. Если выясняется, что вы не достигли поставленной цели, используйте JNI.

90% кода, скорее всего, в любом случае будут склеивать код и приложения. Но имейте в виду, что таким образом вы потеряете некоторые кроссплатформенные функции. Если вы можете жить с этим, JNI всегда оставит вас открытой для исполнения собственного кода.

8 голосов
/ 06 марта 2010

Java подходит для многих аудио приложений. В отличие от некоторых других постеров, я нахожу Java-аудио радостью для работы. Сравните API и ресурсы, доступные вам, с ужасным, едва документированным разумом, который называется CoreAudio, и вы станете сторонником. Аудио в Java страдает от некоторых задержек, хотя для многих приложений это не имеет значения, и из-за отсутствия кодеков. Есть также много людей, которые никогда не удосужились найти время для написания хороших механизмов воспроизведения аудио (подсказка, никогда не закрывайте SourceDataLine, вместо этого записывайте в него нули), и впоследствии обвиняют Java в своих проблемах. С точки зрения API, аудио Java очень простое, очень простое в использовании, и есть много и много рекомендаций на jsresources.org .

5 голосов
/ 02 января 2009

Конечно, почему нет?

Важнейшие вопросы (независимо от языка, это из теории очередей):

  • какая максимальная пропускная способность вам нужна (вы указали 100 x 48 кГц, это моно или стерео, сколько бит эквивалентно на этой частоте?)
  • могут ли ваши подпрограммы Java в среднем справиться с этой скоростью?
  • Какова максимально допустимая задержка?

Если ваша программа в среднем справляется с пропускной способностью, и у вас достаточно места для задержки, тогда вы сможете использовать очереди для входов и выходов, и единственные части программы, которые являются критичными для синхронизации, - это фрагменты, которые помещают данные во входную очередь, выводят их из выходной очереди и отправляют в ЦАП / динамик / что угодно.

Линии задержки имеют низкую вычислительную нагрузку, вам просто нужно достаточно памяти (+ пропускная способность памяти) ... на самом деле вам, вероятно, следует просто использовать для этого очереди ввода / вывода, то есть немедленно начать помещать данные во входную очередь и запустить забрать данные из очереди вывода спустя 30 секунд. Если его там нет, ваша программа работает слишком медленно ...).

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

3 голосов
/ 16 ноября 2011

Да, Java отлично подходит для аудио приложений. Вы можете использовать Java и получать доступ к звуковым слоям через Asio и иметь действительно низкую задержку (задержка 64 сэмплов, которая практически не бывает) на платформе Windows. Это означает, что у вас будет синхронизация по видео / фильму. Больше задержек на Mac, так как у Asio нет «ярлыка» для сочетания OS X и «Java на вершине», но все еще в порядке. Linux тоже, но я более невежественен. На сайте soundpimp.com приведен практический (и впервые в мире) пример работы Java и Asio в идеальной гармонии. Также см. Приложение NRK Radio & tv для Android, содержащее декодер SW mp3 (из Java). Вы можете делать большинство звуковых вещей с Java, а затем использовать собственный слой, если требуется дополнительное время.

3 голосов
/ 06 июля 2009

Я думаю, что задержка будет вашей основной проблемой - довольно сложно поддерживать задержку уже в C / C ++ на современных ОС, и Java, безусловно, добавляет к этой проблеме (сборщик мусора). Общая схема обработки аудио в режиме реального времени заключается в том, чтобы потоки обработки работали в режиме реального времени (SCHED_FIFO в ядрах Linux, эквивалентных в других ОС), и эти потоки никогда не должны блокироваться. Это означает, что нет системных вызовов, нет malloc, нет ввода-вывода, конечно, и т. Д. Даже проблема подкачки страниц является проблемой (получение страницы с диска в память может занять несколько мс), поэтому вам следует заблокировать некоторые страницы, чтобы убедиться, что они никогда не будут поменялись местами.

Вы можете делать это на Java, но Java делает это более сложным, а не простым. Я бы посмотрел на смешанный дизайн, где ядро ​​было бы в C, а остальные (GUI и т. Д.) Были бы в Java, если хотите.

3 голосов
/ 06 июля 2009

Одна вещь, которую я не увидел в вашем вопросе, заключается в том, нужно ли вам воспроизводить эти обработанные сэмплы или вы что-то делаете с ними (например, кодируя их в файл). Я бы больше беспокоился о состоянии звукового движка Java, чем о том, насколько быстро JVM может обрабатывать сэмплы.

Несколько лет назад я довольно сильно нажал на javax.sound.sampled и остался совершенно не впечатленным - он не сравнится с аналогичными платформами, такими как OpenAL или Core Audio для Mac / iPhone (обе из которых я использовал на аналогичный уровень интенсивности). javax.sound.sampled требует, чтобы вы поместили ваши выборки в непрозрачный буфер неизвестной длительности, что делает синхронизацию почти невозможной. Он также плохо документирован (очень трудно найти примеры потоковой передачи аудио неопределенной длины по линии в отличие от тривиальных примеров клипов в памяти), имеет нереализованные методы (DataLine.getLevel () ..., чья нереализация не является ' Я даже считаю, что Sun уволила последнего инженера JavaSound несколько лет назад.

Если бы у меня было , чтобы использовать движок Java для микширования и вывода звука, я бы, вероятно, попытался использовать привязки JOAL к OpenAL в качестве первого выбора, так как я бы по крайней мере знал, что движок был в настоящее время поддерживается и способна с очень низкой задержкой. Хотя в долгосрочной перспективе я подозреваю, что Nils прав, и в итоге вы будете использовать JNI для вызова нативного звукового API.

2 голосов
/ 24 ноября 2009

Проверьте библиотеку под названием Jsyn.

http://www.softsynth.com/jsyn/

0 голосов
/ 09 января 2017

С http://www.jsresources.org/faq_performance.html#java_slow

Давайте соберем немного эфирной мудрости:

  • Земля плоская.

  • и, не стоит забывать: Java медленная.

Как доказывают несколько приложений (см. Раздел ссылок), достаточно Java для создания аудио-редакторов, многодорожечных систем записи и MIDI программное обеспечение для обработки. Попробуйте!

0 голосов
/ 06 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...