Spec-Zone .ru
спецификации, руководства, описания, API
|
Примечания
|
Эта глава обеспечивает введение в архитектуру цифрового аудио API Звука Java, к которой получают доступ через javax.sound.sampled
пакет. Во-первых, объяснение дается фокуса пакета: воспроизведение и получение отформатированных аудиоданных. Затем эта глава описывает три фундаментальных компонента, требуемые для воспроизведения или получения: формат аудиоданных, строка, и микшер.
Line
взаимодействуйте через интерфейс и его подынтерфейсы представляются кратко.
Прежде, чем исследовать элементы API Звука Java, это помогает понять ориентацию javax.sound.sampled
пакет.
javax.sound.sampled
пакет существенно касается аудио транспорта — другими словами, API Звука Java сосредотачивается на воспроизведении и получении. Центральная задача, которую адресует API Звука Java, состоит в том, как переместить байты отформатированных аудиоданных в и из системы. Эта задача включает вводный звуковой вход и устройства вывода и управляющие буферы, которые заполняются звуковыми данными в реальном времени. Это может также включить смешивающиеся многократные потоки аудио в один поток (выводят ли для ввода или). Транспорт звука в или из системы должен быть правильно обработан, когда пользователь запрашивает, чтобы поток звука был запущен, приостановлен, возобновлен, или остановлен.
Чтобы поддерживать это сосредотачивается на основном звуковом входе и выводило, API Звука Java обеспечивает методы для того, чтобы они преобразовали между различными форматами аудиоданных, и для чтения и записи общих типов звуковых файлов. Однако, это не пытается быть всесторонним инструментарием звукового файла. Определенная реализация API Звука Java не должна поддерживать обширный набор преобразований формата данных или типов файлов. Сторонние поставщики услуг могут предоставить модули, которые "включают" к существующей реализации, чтобы поддерживать дополнительные типы файлов и преобразования.
API Звука Java может обработать аудио транспорт и в потоковой передаче, буферизованном виде и в небуферизованном виде в памяти. "Потоковая передача" используется здесь в общем смысле обратиться к обработке в реальном времени аудио байтов; это не обращается к определенному, известному случаю отправки аудио по Интернету в определенном формате. Другими словами поток аудио является просто непрерывным набором аудио байтов, которые прибывают более или менее в тот же самый уровень, что они должны быть обработаны (играемый, записанный, и т.д.) . Операции на байтах начинаются прежде, чем все данные прибыли. В модели потоковой передачи, особенно в случае звукового входа, а не звукового выхода, Вы не обязательно знаете заранее, какой длины звук и когда это закончит прибывать. Вы просто обрабатываете один буфер аудиоданных за один раз, пока работа не останавливается. В случае звукового выхода (воспроизведение) Вы также должны буферизовать данные, если звук, который Вы хотите играть, является слишком большим, чтобы уместиться в памяти внезапно. Другими словами Вы поставляете свои аудио байты звуковому механизму в блоках, и он заботится об игре каждой выборки в нужное время. Механизмы - то, при условии, что облегчают знать сколько данных поставлять в каждом блоке.
API Звука Java также разрешает небуферизованный транспорт в случае воспроизведения только, предполагая, что у Вас уже есть все аудиоданные под рукой, и это не является слишком большим, чтобы уместиться в памяти. В этой ситуации нет никакой потребности в прикладной программе, чтобы буферизовать аудио, хотя буферизованный, подход в реальном времени все еще доступен при желании. Вместо этого весь звук может быть предварительно загружен сразу в память для последующего воспроизведения. Поскольку все звуковые данные загружаются заранее, воспроизведение может сразу запуститься, например, как только пользователь нажимает кнопку Start. Это может быть преимуществом по сравнению с буферизованной моделью, где воспроизведение должно ожидать первого буфера, чтобы заполниться. Кроме того, небуферизованная модель в памяти позволяет звукам быть легко циклично выполненными (циклически повторенные) или набор к произвольным позициям в данных.
Эти две модели для воспроизведения обсуждаются далее в Главе 4, "Воспроизводя Аудио." Буферизованная запись обсуждается в Главе 5, "Получая Аудио."
Чтобы играть или получить звук, используя API Звука Java, Вы нуждаетесь по крайней мере в трех вещах: отформатированные аудиоданные, микшер, и строка. Каждый из них объясняется ниже.
Отформатированные аудиоданные относятся, чтобы звучать в любом из многих стандартных форматов. API Звука Java различает форматы данных и форматы файлов.
Формат данных говорит Вам, как интерпретировать серию байтов "сырых данных" выбранные аудиоданные, таких как выборки, которые были уже считаны из звукового файла, или выборок, которые были получены от ввода микрофона. Вы, возможно, должны были бы знать, например, сколько битов составляет одну выборку (представление самого короткого момента звука), и так же Вы, возможно, должны были бы знать демонстрационный уровень звука (как быстро выборки, как предполагается, следуют за друг другом). Устанавливая для воспроизведения или получения, Вы определяете формат данных звука, который Вы получаете или играете.
В API Звука Java формат данных представляется AudioFormat
объект, который включает следующие атрибуты:
Фрейм содержит данные для всех каналов в определённое время. Для PCM-закодированных данных фрейм является просто набором одновременных выборок во всех каналах, в течение данного момента вовремя, без любой дополнительной информации. В этом случае частота кадров равна демонстрационному уровню, и тип телосложения в байтах является числом каналов, умноженных на объем выборки в битах, разделенных на число битов в байте.
Для других видов кодировок фрейм мог бы содержать дополнительную информацию помимо выборок, и частота кадров могла бы абсолютно отличаться от демонстрационного уровня. Например, считайте MP3 (MPEG 1 Аудио Уровень 3) кодированием, которое явно не упоминается в текущей версии API Звука Java, но которое могло поддерживаться реализацией API Звука Java или сторонним поставщиком услуг. В MP3 каждый фрейм содержит пакет сжатых данных для ряда выборок, не только одной выборки на канал. Поскольку каждый фрейм инкапсулирует целый ряд выборок, частота кадров медленнее чем демонстрационный уровень. Фрейм также содержит заголовок. Несмотря на заголовок, тип телосложения в байтах является меньше чем размер в байтах эквивалентного числа фреймов PCM. (В конце концов цель MP3 состоит в том, чтобы быть более компактной чем данные PCM.) Для такого кодирования демонстрационный уровень и объем выборки обращаются к данным PCM, что закодированный звук будет в конечном счете преобразован в прежде, чем быть поставленным цифро-аналоговому преобразователю (DAC).
Формат файла определяет структуру звукового файла, включая не только формат необработанных аудиоданных в файле, но также и другая информация, которая может храниться в файле. Звуковые файлы, прибывшие в различные стандартные варианты, такие как WAVE (также известный как WAV, и часто связываемый с PC), AIFF (часто связываемый с Макинтошами), и AU (часто связываемый с системами UNIX). У различных типов звукового файла есть различные структуры. Например, у них могло бы быть различное расположение данных в "заголовке" файла. Заголовок содержит дескриптивную информацию, которая обычно предшествует фактическим аудиосэмплам файла, хотя некоторые форматы файлов позволяют последовательные "блоки" дескриптивных и аудиоданных. Заголовок включает спецификацию формата данных, который использовался для того, чтобы сохранить аудио в звуковом файле. Любой из этих типов звукового файла может содержать различные форматы данных (хотя обычно есть только один формат данных в пределах данного файла), и тот же самый формат данных может использоваться в файлах, у которых есть различные форматы файлов.
В API Звука Java формат файла представляется AudioFileFormat
объект, который содержит:
AudioSystem
класс (описанный в Главе 3, "Получая доступ к Ресурсам Аудиосистемы") обеспечивает методы для чтения и записи звуков в различных форматах файлов, и для того, чтобы преобразовать между различными форматами данных. Некоторые из методов, которым позволяют Вы получить доступ к содержанию файла через своего рода поток, вызванный AudioInputStream
. AudioInputStream
подкласс универсального Java InputStream
класс, который инкапсулирует серию байтов, которые могут быть считаны последовательно. К его суперклассу, AudioInputStream
класс добавляет знание формата аудиоданных байтов (представленный AudioFormat
объект). Читая звуковой файл как AudioInputStream
, Вы получаете немедленный доступ к выборкам, не имея необходимость волноваться о структуре звукового файла (ее заголовок, блоки, и т.д.). Единственный вызов метода дает Вам всю информацию, в которой Вы нуждаетесь о формате данных и типе файла.
Много прикладных программных интерфейсов (API) для звука используют понятие аудио устройства. Устройство часто является интерфейсом программного обеспечения к физическому вводу/устройству вывода. Например, звуковое устройство ввода могло бы представить входные возможности звуковой платы, включая ввод микрофона, аналоговый вход на уровне строки, и возможно ввод цифрового аудио.
В API Звука Java устройства представляются Mixer
объекты. Цель микшера состоит в том, чтобы обработать один или более потоков звукового входа и один или более потоков звукового выхода. В типичном случае это фактически смешивает вместе многократные входящие потоки в один исходящий поток. A Mixer
объект может представить смешивающие звук возможности физического устройства, такие как звуковая плата, которая, возможно, должна была бы смешать звук, входящий к компьютеру от различных вводов, или звуку, прибывающему из прикладных программ и идущему в выводы.
Альтернативно, a Mixer
объект может представить смешивающие звук возможности, которые реализуются полностью в программном обеспечении без любого свойственного интерфейса к физическим устройствам.
В API Звука Java компонент, такой как ввод микрофона на звуковой плате самостоятельно не считают устройством — то есть, микшер — а скорее порт в или из микшера. Порт обычно обеспечивает единый поток аудио в или из микшера (хотя поток может быть многоканальным, таким как стерео). У микшера могли бы быть несколько таких портов. Например, микшер, представляющий выходные возможности звуковой платы, мог бы смешать несколько потоков аудио вместе, и затем отправить смешанный сигнал любым из различных выходных портов, соединенных с микшером. Эти выходные порты могли быть (например) гнездом для наушников, встроенным динамиком, или выводом на уровне строки.
Чтобы понять понятие микшера в API Звука Java, это помогает визуализировать физическую консоль смешивания, такую как используемые на живых концертах и студиях звукозаписи. (См. иллюстрацию, которая следует.)
Физическая Консоль СмешиванияУ физического микшера есть "полосы" (также названный "частями"), каждый представляющий путь, через который единственный аудиосигнал входит в микшер для того, чтобы обработать. У полосы есть кнопки и другие средства управления, которыми можно управлять объемом и панорамированием (размещение в изображении стерео) для сигнала в той полосе. Кроме того, у микшера могла бы быть отдельная шина для эффектов, таких как реверберация, и эта шина может быть соединена с внутренним или внешним модулем реверберации. У каждой полосы есть потенциометр, который управляет сколько, из которых сигнал полосы входит в отраженное соединение. Отраженное ("влажное") соединение тогда смешивается с "сухими" сигналами от полос. Физический микшер отправляет эту заключительную смесь выходной шине, которая обычно идет в магнитофон (или находящаяся на диске система записи) и/или динамики.
Вообразите живой концерт, который записывается в стерео. Кабели (или беспроводные соединения) прибывающий из многих микрофонов и электрических инструментов на этапе включаются во вводы смешивающейся консоли. Каждый ввод идет в отдельную полосу микшера, как иллюстрировано. Звукооператор выбирает настройки усиления, панорамирования, и средств управления реверберацией. Вывод всех полос и модуля реверберации смешивается вместе в два канала. Эти два канала идут в два вывода на микшере, в который кабели включаются что подключение к вводам магнитофона стерео. Два канала, возможно, также отправляются через усилитель динамикам в зале, в зависимости от типа музыки и размера зала.
Теперь вообразите студию звукозаписи, в которой каждый инструмент или певец записываются к отдельной дорожке многодорожечного магнитофона. После того, как инструменты и певцы были все записаны, инженер записи выполняет "mixdown", чтобы объединить все записанные на ленту дорожки в с двумя каналами (стерео), записывающий, который может быть распределен на компакт-дисках. В этом случае ввод к каждой из полос микшера не является микрофоном, но одной дорожкой многодорожечной записи. Еще раз инженер может использовать средства управления на полосах, чтобы решить объем каждой дорожки, панорамирование, и количество реверберации. Выводы микшера идут еще раз в устройство записи стерео и в динамики стерео, как в примере живого концерта.
Эти два примера иллюстрируют два различного использования микшера: чтобы получить многократные входные каналы, объедините их в меньшее количество дорожек, и сохраните смесь, или воспроизвести многократные дорожки, смешивая их вниз к меньшему количеству дорожек.
В API Звука Java микшер может так же использоваться для ввода (получающий аудио) или выведен (воспроизведение аудио). В случае ввода источник, из которого микшер получает аудио для того, чтобы оно смешалось, один или более входные порты. Микшер отправляет полученные и смешанные аудиопотоки своей цели, которая является объектом с буфером, от которого прикладная программа может получить эти смешанные аудиоданные. В случае звукового выхода инвертируется ситуация. Источник микшера для аудио является одним или более объектами, содержащими буферы, в которые или больше прикладных программ пишут их звуковые данные; и цель микшера один или более выходные порты.
Метафора физической консоли смешивания также полезна для понимания понятия API Звука Java строки.
Строка является элементом цифрового аудио "конвейер" — то есть, путь для движущегося аудио в или из системы. Обычно строка является путем в или из микшера (хотя технически сам микшер является также своего рода строкой).
Звуковой вход и выходные порты являются строками. Они походят на микрофоны и динамики, соединенные с физической консолью смешивания. Другой вид строки является информационным каналом, через который прикладная программа может получить введенное аудио от, или отправить выходное аудио, микшер. Эти информационные каналы походят на дорожки многодорожечного устройства записи, соединенного с физической консолью смешивания.
Одно различие между строками в API Звука Java и таковых из физического микшера - то, что аудиоданные, текущие через строку в API Звука Java, могут быть моно или многоканальными (например, стерео). В отличие от этого, каждый из входов и выходов физического микшера обычно является единственным каналом звука. Чтобы получить два или больше канала вывода от физического микшера, два или больше физических вывода обычно используются (по крайней мере, в случае аналогового звука; разъем цифрового выхода является часто многоканальным). В API Звука Java число каналов в строке определяется AudioFormat
из данных, которые являются в настоящий момент плавными через строку.
Теперь давайте исследуем некоторые определенные виды строк и микшеров. Следующая схема показывает различные типы строк в простой системе звукового выхода, которая могла быть частью реализации API Звука Java:
Возможная Конфигурация Строк для Звукового выходаВ этом примере прикладная программа получила доступ к некоторым доступным вводам микшера звукового входа: один или более клипов и строки исходных данных. Клип является вводом микшера (своего рода строка), в который можно загрузить аудиоданные до воспроизведения; строка исходных данных является вводом микшера, который принимает поток в реальном времени аудиоданных. Прикладная программа предварительно загружает аудиоданные от звукового файла в клипы. Это тогда продвигает другие аудиоданные в строки исходных данных, буфер за один раз. Микшер читает данные из всех этих строк, у каждой из которых могут быть своя собственная реверберация, усиление, и средства управления панорамированием, и смешивается, сухие аудиосигналы с влажным (отражались) соединение. Микшер поставляет свой окончательный результат один или более выходные порты, такие как динамик, гнездо для наушников, и разъем строки.
Хотя различные строки изображаются как отдельные прямоугольники в схеме, они все "принадлежат" микшеру, и могут считаться неотъемлемыми частями микшера. Реверберация, усиление, и прямоугольники панорамирования представляют средства управления обработкой (а не строки), который может быть применен микшером к данным, текущим через строки.
Отметьте, что это - только один пример возможного микшера, который поддерживается API. Не у всех аудио конфигураций будут все функции иллюстрированными. Отдельная строка исходных данных не могла бы поддерживать панорамирование, микшер не мог бы реализовать реверберацию и так далее.
Простая система звукового входа могла бы быть подобной:
Возможная Конфигурация Строк для Звукового входаЗдесь, потоки данных в микшер от один или более входные порты, обычно микрофон или строка - в разъеме. Усиление и панорамирование применяются, и микшер поставляет полученные данные прикладной программе через целевую строку данных микшера. Целевая строка данных является выводом микшера, содержа смесь переданных потоком входных звуков. У самого простого микшера есть только одна целевая строка данных, но некоторые микшеры могут поставить полученные данные многократным целевым строкам данных одновременно.
Теперь, когда мы видели некоторые функциональные изображения того, что выравнивает, и микшеры, давайте обсуждать их с немного большей программируемой точки зрения. Несколько типов строки определяются подынтерфейсами основного Line
интерфейс. Интерфейсную иерархию показывают ниже.
Основной интерфейс, Line
, описывает минимальную функциональность, характерную для всех строк:
Line
может представить другие типы событий. Когда строка генерирует событие, событие отправляется всем объектам, которые зарегистрировались, чтобы "слушать" для событий на той строке. Прикладная программа может создать эти объекты, зарегистрировать их, чтобы прислушаться к событиям строки, и реагировать на события как требующийся.
Line
интерфейс. Ports
простые строки для ввода или вывода аудио к или от аудио устройств. Как отмечалось ранее некоторые общие типы портов являются микрофоном, вводом строки, дисководом для компакт-дисков, динамиком, наушником, и выводом строки.
Mixer
интерфейс представляет микшер, конечно, который, как мы видели, представляет или аппаратные средства или устройство программного обеспечения. Mixer
интерфейс обеспечивает методы для того, чтобы они получили строки микшера. Они включают исходные строки, которые подают аудио к микшеру, и предназначаются для строк, которым микшер поставляет свое смешанное аудио. Для микшера звукового входа исходные строки являются входными портами, такими как ввод микрофона, и целевые строки TargetDataLines
(описанный ниже), которые поставляют аудио прикладной программе. Для микшера звукового выхода, с другой стороны, исходные строки Clips
или SourceDataLines
(описанный ниже), к которому прикладная программа подает аудиоданные, и целевые строки, выходные порты, такие как динамик.
A Mixer
определяется как наличие того или большего количества исходных строк и один или более целевых строк. Отметьте, что это определение означает, что микшер не должен фактически смешать данные; у этого могло бы быть только единственная исходная строка. Mixer
API предназначается, чтобы охватить множество устройств, но типичный случай поддерживает смешивание.
Mixer
интерфейс поддерживает синхронизацию; то есть, можно определить, что две или больше из строк микшера обрабатываются как синхронизируемая группа. Затем можно запустить, остановиться, или закрыть все те строки данных, отправляя единственное сообщение любой строке в группе, вместо того, чтобы иметь необходимость управлять каждой строкой индивидуально. С микшером, который поддерживает эту функцию, можно получить демонстрационно-точную синхронизацию между строками.
Обобщение Line
интерфейс не обеспечивает средство запустить и остановить воспроизведение или запись. Для этого Вы нуждаетесь в строке данных. DataLine
взаимодействуйте через интерфейс предоставляет следующие дополнительные связанные с носителями функции вне таковых a Line
:
START
и STOP
события производятся, когда активное представление или получение данных от или до строки данных запускаются или останавливаются. A TargetDataLine
получает аудиоданные от микшера. Обычно, микшер получил аудиоданные от порта, такого как микрофон; это могло бы обработать или смешать это полученное аудио прежде, чем поместить данные в целевой буфер строки данных. TargetDataLine
интерфейс обеспечивает методы для того, чтобы они считали данные из целевого буфера строки данных и для того, чтобы определить, сколько данных в настоящий момент доступно для чтения.
A SourceDataLine
получает аудиоданные для воспроизведения. Это обеспечивает методы для того, чтобы они записали данные в буфер строки исходных данных для воспроизведения, и для того, чтобы определить, сколько данных строка готовится получить без блокирования.
A Clip
строка данных, в которую аудиоданные могут быть загружены до воспроизведения. Поскольку данные предварительно загружаются, а не передаются потоком, продолжительность клипа известна перед воспроизведением, и можно выбрать любую стартовую позицию в носителях. Клипы могут быть циклично выполнены, означая, что на воспроизведение, все данные между двумя указанными точками цикла повторят конкретное количество времен, или неопределенно.
Эта глава представила большинство важных интерфейсов и классов API выбранного аудио. Последующее шоу глав, как можно получить доступ и использовать эти объекты в своей прикладной программе.