ОС Android обеспечивает широкую поддержку мультимедиа, включающую в себя как аудио, так и видео. В этом руководстве рассматриваются настройки аудио в Android и рассказывается о воспроизведении и записи звука с помощью встроенных классов аудиоплеера и диктофона, а также низкоуровневого API аудио. В нем также рассматривается работа с аудиособытиями, транслируемыми другими приложениями, чтобы разработчики могли создавать хорошо управляемые приложения.
Обзор Xamarin Android player
В современных мобильных устройствах реализованы функции, для которых раньше требовалось специальное оборудование – камеры, музыкальные проигрыватели и видеомагнитофоны. В связи с этим мультимедийные фреймворки стали первоклассной функцией в мобильных API.
Android обеспечивает широкую поддержку мультимедиа. В этой статье рассматривается работа с аудио в Android, и в ней рассматриваются следующие темы:
- Воспроизведение аудио с помощью MediaPlayer – использование встроенного класса MediaPlayer для воспроизведения аудио, включая локальные аудиофайлы и потоковые аудиофайлы с помощью класса AudioTrack.
- Запись аудио – использование встроенного класса MediaRecorder для записи аудио.
- Работа с аудиоуведомлениями – использование аудиоуведомлений для создания послушных приложений, которые правильно реагируют на события (например, входящие телефонные звонки), приостанавливая или отменяя их аудиовыходы.
- Работа с низкоуровневым аудио – воспроизведение аудио с помощью класса AudioTrack путем записи непосредственно в буферы памяти. Запись звука с помощью класса AudioRecord и чтение непосредственно из буферов памяти.
Требования для Xamarin Android player
Данное руководство требует Android 2.0 (уровень API 5) или выше. Обратите внимание, что отладка аудио на Android должна выполняться на устройстве.
Необходимо запросить разрешения RECORD_AUDIO в AndroidManifest.XML:
Воспроизведение аудио с помощью класса MediaPlayer
Самый простой способ воспроизведения аудио в Android – это встроенный класс MediaPlayer, который может воспроизводить как локальные, так и удаленные файлы, передавая путь к файлу. Однако MediaPlayer очень чувствителен к состоянию, и вызов одного из его методов в неправильном состоянии приведет к возникновению исключения. Важно взаимодействовать с MediaPlayer в порядке, описанном ниже, чтобы избежать ошибок.
Инициализация и воспроизведение
Воспроизведение аудио с помощью MediaPlayer требует следующей последовательности действий:
- Инициализируйте новый объект MediaPlayer.
- Настройте файл для воспроизведения с помощью метода SetDataSource.
- Вызовите метод Prepare для инициализации проигрывателя.
- Вызовите метод Start, чтобы начать воспроизведение аудио.
Приведенный ниже пример кода иллюстрирует это использование:
protected MediaPlayer player; public void StartPlayer(String filePath) { if (player == null) { player = new MediaPlayer(); } else { player.Reset(); player.SetDataSource(filePath); player.Prepare(); player.Start(); } }
Приостановка и возобновление воспроизведения
Воспроизведение можно приостановить, вызвав метод Pause:
player.Pause();
Чтобы возобновить приостановленное воспроизведение, вызовите метод Start. Это приведет к возобновлению воспроизведения с того места, где оно было приостановлено:
player.Start();
Вызов метода Stop на проигрывателе завершает текущее воспроизведение:
player.Stop();
Когда игрок больше не нужен, ресурсы должны быть освобождены путем вызова метода Release:
player.Release();
Использование класса MediaRecorder для записи звука
Взаимодополнением к MediaPlayer для записи звука в Android является класс MediaRecorder. Как и MediaPlayer, он чувствителен к состоянию и проходит через несколько состояний, чтобы достичь момента, когда он может начать запись. Для записи звука необходимо установить разрешение RECORD_AUDIO.
Инициализация и запись
Запись звука с помощью MediaRecorder требует выполнения следующих шагов:
- Инициализируйте новый объект MediaRecorder.
- Укажите, какое аппаратное устройство будет использоваться для захвата входного аудиосигнала с помощью метода SetAudioSource.
- Установите аудиоформат выходного файла с помощью метода SetOutputFormat. Список поддерживаемых типов аудио смотрите в разделе Поддерживаемые медиаформаты Android.
- Вызовите метод SetAudioEncoder, чтобы установить тип кодирования звука.
- Вызовите метод SetOutputFile, чтобы указать имя выходного файла, в который записываются аудиоданные.
- Вызовите метод Prepare для инициализации диктофона.
- Вызовите метод Start, чтобы начать запись.
Приведенный ниже пример кода иллюстрирует эту последовательность действий:
protected MediaRecorder recorder; void RecordAudio (String filePath) { try { if (File.Exists (filePath)) { File.Delete (filePath); } if (recorder == null) { recorder = new MediaRecorder (); // Initial state. } else { recorder.Reset (); recorder.SetAudioSource (AudioSource.Mic); recorder.SetOutputFormat (OutputFormat.ThreeGpp); recorder.SetAudioEncoder (AudioEncoder.AmrNb); // Initialized state. recorder.SetOutputFile (filePath); // DataSourceConfigured state. recorder.Prepare (); // Prepared state recorder.Start (); // Recording state. } } catch (Exception ex) { Console.Out.WriteLine( ex.StackTrace); } }
Остановка записи
Чтобы остановить запись, вызовите метод Stop на MediaRecorder:
recorder.Stop();
Очистка
После того как MediaRecorder был остановлен, вызовите метод Reset, чтобы вернуть его в состояние покоя:
recorder.Reset();
Когда MediaRecorder больше не нужен, его ресурсы должны быть освобождены путем вызова метода Release:
recorder.Release();
Управление аудиоуведомлениями
Класс AudioManager
Класс AudioManager предоставляет доступ к аудиоуведомлениям, которые сообщают приложениям о возникновении аудиособытий. Эта служба также предоставляет доступ к другим аудиофункциям, таким как управление громкостью и режимом звонка. AudioManager позволяет приложению обрабатывать аудиоуведомления для управления воспроизведением аудио.
Управление фокусом аудио
Аудиоресурсы устройства (встроенный проигрыватель и диктофон) совместно используются всеми запущенными приложениями.
Концептуально это похоже на работу приложений на настольном компьютере, где только одно приложение имеет фокус клавиатуры: после выбора одного из запущенных приложений щелчком мыши, клавиатурный ввод поступает только в это приложение.
Аудиофокус – это аналогичная идея, которая не позволяет нескольким приложениям одновременно воспроизводить или записывать звук. Он сложнее, чем фокус клавиатуры, поскольку является произвольным, приложение может игнорировать тот факт, что в данный момент у него нет фокуса звука, и играть независимо от него, поскольку существуют различные типы фокуса звука, которые могут быть запрошены. Например, если ожидается, что приложение будет воспроизводить аудио только в течение очень короткого времени, оно может запросить временный фокус.
Аудиофокус может быть предоставлен немедленно или сначала отклонен и предоставлен позже. Например, если приложение запрашивает фокус аудио во время телефонного разговора, ему будет отказано, но фокус вполне может быть предоставлен по окончании разговора. В этом случае регистрируется слушатель, чтобы соответствующим образом отреагировать, если аудиофокус будет отобран. Запрос фокуса звука используется для определения того, можно ли воспроизводить или записывать звук.
Регистрация обратного вызова для аудиофокуса
Регистрация обратного вызова FocusChangeListener из IOnAudioChangeListener является важной частью получения и освобождения аудиофокуса. Это связано с тем, что предоставление аудиофокуса может быть отложено до более позднего времени. Например, приложение может запросить воспроизведение музыки во время телефонного разговора. Аудиофокус не будет предоставлен до завершения телефонного разговора.
По этой причине объект обратного вызова передается в качестве параметра в метод GetAudioFocus менеджера AudioManager, и именно этот вызов регистрирует обратный вызов. Если аудиофокус изначально отклонен, но затем предоставлен, приложение информируется об этом, вызывая OnAudioFocusChange для обратного вызова. Этот же метод используется, чтобы сообщить приложению, что аудиофокус будет снят.
Когда приложение завершает использование аудиоресурсов, оно вызывает метод AbandonFocus менеджера AudioManager и снова передает обратный вызов. Это отменяет регистрацию обратного вызова и освобождает аудиоресурсы, чтобы другие приложения могли получить аудиофокус.
Запрос аудиофокуса
Чтобы запросить аудиоресурсы устройства, необходимо выполнить следующие действия:
- получите обработчик системной службы AudioManager;
- создайте экземпляр класса обратного вызова;
- запросите аудиоресурсы устройства, вызвав метод RequestAudioFocus на AudioManager . Параметрами являются объект обратного вызова, тип потока (музыка, голосовой вызов, звонок и т.д.) и тип запрашиваемого права доступа (аудиоресурсы могут быть запрошены, например, на мгновение или на неопределенный срок);
- если запрос удовлетворен, немедленно вызывается метод playMusic, и аудиозапись начинает воспроизводиться;
- если запрос отклонен, никаких дальнейших действий не предпринимается. В этом случае аудиозапись будет воспроизводиться только в том случае, если запрос будет удовлетворен позднее.
В приведенном ниже примере кода показаны эти шаги:
Boolean RequestAudioResources(INotificationReceiver parent) { AudioManager audioMan = (AudioManager) GetSystemService(Context.AudioService); AudioManager.IOnAudioFocusChangeListener listener = new MyAudioListener(this); var ret = audioMan.RequestAudioFocus (listener, Stream.Music, AudioFocus.Gain ); if (ret == AudioFocusRequest.Granted) { playMusic(); return (true); } else if (ret == AudioFocusRequest.Failed) { return (false); } return (false); }
Освобождение фокуса аудио
Когда воспроизведение трека завершено, вызывается метод AbandonFocus в AudioManager. Это позволяет другому приложению получить аудиоресурсы устройства. Другие приложения получат уведомление об изменении фокуса аудио, если они зарегистрировали своих слушателей.
Аудио API низкого уровня
Низкоуровневые API аудио обеспечивают больший контроль над воспроизведением и записью аудио, поскольку они взаимодействуют непосредственно с буферами памяти, а не используют URI файлов. Есть некоторые сценарии, в которых этот подход предпочтительнее. К таким сценариям относятся:
- воспроизведение из зашифрованных аудиофайлов;
- воспроизведение последовательности коротких клипов;
- потоковое воспроизведение аудио.
Класс AudioTrack
Класс AudioTrack использует низкоуровневые API для записи звука и является низкоуровневым эквивалентом класса MediaPlayer.
Инициализация и воспроизведение
Для воспроизведения аудио необходимо инициализировать новый экземпляр класса AudioTrack. Список аргументов, передаваемый в конструктор, определяет, как воспроизвести аудиосэмпл, содержащийся в буфере. Аргументами являются:
- тип потока – голос, мелодия звонка, музыка, система или сигнал тревоги;
- частота – частота дискретизации, выраженная в Гц;
- конфигурация канала – моно или стерео;
- формат аудио – 8-битное или 16-битное кодирование;
- размер буфера – в байтах;
- режим буфера – потоковый или статический.
После создания вызывается метод Play для AudioTrack, чтобы настроить его для начала воспроизведения. Запись звукового буфера в AudioTrack запускает воспроизведение:
void PlayAudioTrack(byte[] audioBuffer) { AudioTrack audioTrack = new AudioTrack( // Stream type Stream.Music, // Frequency 11025, // Mono or stereo ChannelOut.Mono, // Audio encoding Android.Media.Encoding.Pcm16bit, // Length of the audio clip. audioBuffer.Length, // Mode. Stream or static. AudioTrackMode.Stream); audioTrack.Play(); audioTrack.Write(audioBuffer, 0, audioBuffer.Length); }
Приостановка и остановка воспроизведения
Чтобы приостановить воспроизведение, вызовите метод Пауза:
audioTrack.Pause();
Вызов метода Stop приведет к окончательному завершению воспроизведения:
audioTrack.Stop();
Очистка
Когда аудиодорожка больше не нужна, ее ресурсы должны быть освобождены вызовом Release:
audioTrack.Release();
Класс AudioRecord
Класс AudioRecord является эквивалентом AudioTrack со стороны записи. Как и AudioTrack, он использует буферы памяти напрямую, вместо файлов и URI. Он требует, чтобы разрешение RECORD_AUDIO было установлено в манифесте.
Инициализация и запись
Первым шагом является создание нового объекта AudioRecord. Список аргументов, передаваемый в конструктор, содержит всю информацию, необходимую для записи. В отличие от AudioTrack, где аргументы в основном представляют собой перечисления, эквивалентные аргументы в AudioRecord являются целыми числами. К ним относятся:
- аппаратный источник входного аудиосигнала, например, микрофон;
- тип потока – голос, мелодия звонка, музыка, система или сигнал тревоги;
- частота – Частота дискретизации, выраженная в Гц;
- конфигурация канала – моно или стерео;
- формат аудио – 8-битное или 16-битное кодирование;
- размер буфера – байт.
После создания аудиозаписи вызывается ее метод StartRecording. Теперь он готов начать запись. AudioRecord непрерывно считывает входной аудиобуфер и записывает его в аудиофайл.
void RecordAudio() { byte[] audioBuffer = new byte[100000]; var audRecorder = new AudioRecord( // Hardware source of recording. AudioSource.Mic, // Frequency 11025, // Mono or stereo ChannelIn.Mono, // Audio encoding Android.Media.Encoding.Pcm16bit, // Length of the audio clip. audioBuffer.Length ); audRecorder.StartRecording(); while (true) { try { // Keep reading the buffer while there is audio input. audRecorder.Read(audioBuffer, 0, audioBuffer.Length); // Write out the audio file. } catch (Exception ex) { Console.Out.WriteLine(ex.Message); break; } } }
Остановка записи
Вызов метода Stop завершает запись:
audRecorder.Stop();
Очистка
Когда объект AudioRecord больше не нужен, вызов его метода Release освобождает все связанные с ним ресурсы:
audRecorder.Release();
Резюме
ОС Android предоставляет мощную основу для воспроизведения, записи и управления аудио. В этой статье рассказывалось о том, как воспроизводить и записывать аудио с помощью высокоуровневых классов MediaPlayer и MediaRecorder. Мы также описали, как использовать аудиоуведомления для обмена аудиоресурсами устройства между различными приложениями. Наконец, в статье рассматривались способы воспроизведения и записи звука с помощью низкоуровневых API, которые напрямую взаимодействуют с буферами памяти.
О том, как работать в Live Player в Xamarin читайте далее в нашей статье.
- Обзор Xamarin Android player
- Требования для Xamarin Android player
- Воспроизведение аудио с помощью класса MediaPlayer
- Инициализация и воспроизведение
- Приостановка и возобновление воспроизведения
- Использование класса MediaRecorder для записи звука
- Управление аудиоуведомлениями
- Аудио API низкого уровня
- Резюме