Работа с аудио и видеоинформацией в приложениях для смартфона, использование Intel Perceptual Computing SDK
Введение
Одной из особенностей смартфонов является тот факт, что для большинства их владельцев не последнюю роль играет возможность использования этого "умного телефона" в качестве аудио или видеоплеера, поэтому современные устройства становятся все более и более мультимедийными. В состав платформы Android входит набор библиотек для обработки мультимедиа Media Framework, в котором реализована поддержка большинства общих медиа-форматов. В связи с чем, в приложения, разрабатываемые для смартфонов под управлением Android, можно интегрировать запись и воспроизведение аудио и видео, а также возможность распознавания речи.
Идеи естественно-интуитивного взаимодействия человека с компьютером (perceptual computing), предполагают способность вычислительных устройств понимать человека через физический контакт, словесные команды и жесты. Разработчикам программного обеспечения использование новых идей позволит создавать приложения, вносящие ощущение присутствия и погружения. Такого эффекта можно добиться реализацией возможностей отслеживания жестов рук и пальцев, анализа лица (мимики), распознавания голоса (речи), отслеживания перемещений 2D/3D объектов. Умение разрабатывать такие приложения в ближайшем будущем будет востребовано. Intel® Perceptual Computing SDK позволяет добавлять элементы естественно-интуитивного взаимодействия в приложения и снизить стоимость разработки таких приложений.
Основы работы с аудио и видеоинформацией
Воспроизведение аудио и видео
Первый вопрос, который будет интересовать нас в данной лекции, связан с возможностью создания приложений, воспроизводящих аудио и видеоинформацию. Android API содержит класс MediaPlayer, упрощающий разработку таких приложений. Мультимедиа библиотека Android включает поддержку воспроизведения множества наиболее распространенных форматов, что позволяет легко использовать в приложениях аудио, видео и изображения. Можно проигрывать аудио или видео из медиа файлов сохраненных как ресурсы приложения (raw ресурсы), из файлов, расположенных в файловой системе или из потока данных, получаемого через сетевое соединение, для всего этого используется MediaPlayer API. Актуальная информация о поддерживаемых форматах аудио и видео приводится по ссылке: http://developer.android.com/guide/appendix/media-formats.html
Для воспроизведения аудио и видео необходимо создать новый экземпляр класса MediaPlayer, задать источник медиа-информации и подготовить его к воспроизведению. Подробно жизненный цикл класса MediaPlayer рассмотрен в лекции 9 курса "Введение в разработку приложений для ОС Android" на Интуит (http://www.intuit.ru/studies/courses/12643/1191/lecture/21992?page=2#sect7).
Рассмотрим работу с аудио-данными. Самый простой способ инициализации плеера для воспроизведения аудио-контента заключается в использовании метода create(), в который в качестве параметров передаются контекст приложения и источник аудио-данных.
MediaPlayer mediaPlayer = MediaPlayer.create(context, source);
параметр source задает источник и может иметь одно из следующих значений:
- идентификатор ресурса;
- путь URI к локальному файлу (используя схему file://);
- путь URI к удаленному ресурсу с аудио, предоставленному в виде URL;
- путь URI к записи внутри локального Источника данных
Код в примере 11.1 демонстрирует разные источники инициализации медиаплеера. Необходимо отметить, что для объекта MediaPlayer, возвращаемого методом create(), уже был вызван метод prepare(), поэтому не надо вызывать его еще раз.
MediaPlayer resPlayer = MediaPlayer.create(getApplicationContext(), R.raw.my_audio); MediaPlayer filePlayer = MediaPlayer.create(getApplicationContext(), Uri.parse("file:///sdcard/localfile.mp3")); MediaPlayer urlPlayer = MediaPlayer.create(getApplicationContext(), Uri.parse("http://site.com/audio/audio.mp3")); MediaPlayer contPlayer = MediaPlayer.create(getApplicationContext(), Settings.System.DEFAULT_RINGTONE_URI);Пример 11.1.
Другой способ инициализации плеера для воспроизведения аудио-контента заключается в использовании метода setDataSource(), в этом случае сначала необходимо создать экземпляр класса MediaPlayer. В качестве параметра этот метод принимает путь к файлу, путь URI к источнику данных, адрес URL мультимедийного потока или файловый дескриптор.
Используя данный подход, важно не забыть вызвать метод prepare() класса MediaPlayer, прежде чем начинать воспроизведение, как показано в примере 11.2 .
MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("/sdcard/test.3gp"); mediaPlayer.prepare();Пример 11.2.
Если вы передаете адрес URL, который ссылается на файл в Интернете, удаленный сервер должен поддерживать последовательную загрузку с помощью протоколов RTSP или HTTP.
Рассмотрим работу с видео-данными. Первым делом при использовании медиаплеера с целью воспроизведения видео необходимо подготовить поверхность, на которой это видео будет отображаться. Поэтому необходимо, чтобы окно активности приложения содержало элемент SurfaceView, а медиаплеер получил объект класса SurfaceHolder с помощью метода setDisplay(), как показано в примере 11.3.
MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDisplay(((SurfaceView)findViewById(R.id.surfaceView1)). GetHolder()); mediaPlayer.setDataSource("/sdcard/test2.3gp"); mediaPlayer.prepare();Пример 11.3.
Инициализация видео-контента использует метод setDataSource(), как показано в примере 11.3. В отличие от ресурсов с аудиоданными, Android не поддерживает проигрывание видео, включенного в проект в качестве ресурса. А также нет возможности использовать статический метод create() для упрощенного создания объекта MediaPlayer и путь URI, ссылающийся на локальный файл с помощью схемы file://.
После подготовки медиаплеера можно начать воспроизведение соответствующих мультимедийных данных, для запуска воспроизведения используется метод:
mediaPlayer.start();
Процессом воспроизведения можно управлять с помощью методов stop() и pause(), позволяющих остановить или приостановить воспроизведение, и метода start(), позволяющего снова запустить воспроизведение.
Класс MediaPlayer также предоставляет методы getDuration() — позволяет получить длину воспроизводимого аудио или видео и getCurrentPosition() —возвращает текущую позицию. Чтобы перейти к определенной позиции, необходимо использовать метод seekTo().
В процессе воспроизведения медиаплеер позволяет регулировать громкость:
mediaPlayer.setVolume(1f, 0.5f);
метод setVolume() позволяет управлять громкостью каждого аудиоканала. В качестве параметров этот метод принимает скалярные значения с плавающей точкой в диапазоне между 0 и 1 для обоих каналов (где 0 — полная тишина, а 1 — максимальная громкость).
В процессе воспроизведения медиаплеер позволяет уберечь подсветку экрана от автоматического отключения с помощью метода setScreenOnWhilePlaying().
mediaPlayer.setScreenOnWhilePlaying(true);
В случае, если в приложении предполагается сохранение экрана и процессора от засыпания, или использование методов класса MediaPlayer: setWakeMode() и setScreenOnWhilePlaying(), необходимо добавить в файл манифеста следующую строку:
<uses-permission android:name="android.permission.WAKE_LOCK" />
Медиаплеер предоставляет возможность проигрывать файлы в режиме повторения для этого существуют методы isLooping() и setLooping():
if (!mediaPlayer.isLooping()) mediaPlayer.setLooping(true);
В настоящее время нельзя воспроизводить аудиоданные одновременно с разговором по телефону. Медиаплеер всегда использует стандартное устройство для вывода звука — динамик или подключенную по Bluetooth гарнитуру. При воспроизведении видеоресурсов можно использовать метод getFrame(), чтобы получить заданный кадр.
При завершении процесса воспроизведения необходимо вызвать метод release() класса MediaPlayer, чтобы освободить соответствующие ресурсы:
mediaPlayer.release();
Android поддерживает ограниченное число одновременно работающих объектов MediaPlayer. Если не выполнять освобождение ресурсов, можно столкнуться с выбросом исключения, когда система исчерпает ресурсы.