В прошлый раз в обзорной статье про Intel INDE мы упомянули о Media Pack и его ключевых возможностях. В этой статье мы остановимся на нем более подробно.
INDE Media Pack — это библиотека, включающая в себя различные компоненты для работы с аудио и видео. С точки зрения реализации — это надстройка над медиа компонентами Android, использующая аппаратное ускорение для кодирования и декодирования видео. По сравнению с использованием классов для работы с мультимедиа в Android, она гораздо более проста в использовании, разработчику нет нужды разбираться во всех тонкостях работы медиа кодеков, экстрактора, муксера, только для того, чтобы встроить в свое приложение возможность работы с видео.
Приложения, использующие Media Pack, будут работать на всех архитектурах (ARM, IA), на устройствах, работающих на Android 4.3 и выше.
Скачать библиотеку можно, используя ссылку на официальной странице Intel INDE. После установки менеджера Intel INDE открываем его, выбираем компонент Media, далее Download, после того, как он будет загружен, запускаем установку (Install).
По завершении установки в выбранной директории будет создана папка, содержащая все, что нужно для начала работы с Media Pack.
Давайте начнем со сборки и запуска примеров, т.к. это самый быстрый и наглядный способ оценить, на что же способен Media Pack. Для этого нам потребуется Eclipse и устройство на Android версии 4.3 или выше.
Запускаем Eclipse далее File -> New -> Project -> Android Project From Existing Code
У проекта samples есть зависимость от проекта effects, чтобы Eclipse правильно определил все зависимости, необходимо импортировать сразу оба проекта. Для этого в качестве корневой директории необходимо указать путь к папке samples и отметить оба проекта для импорта — apps и effects.
Запускаем импортированный пакет apps как Android приложение, после сборки и запуска приложения появится главная активность приложения, в которой представлены различные модели использования, которые предлагает Media Pack.
Game Capturing – захват видео из приложения, использующего OpenGL
Transcode Video – преобразование видео с заданными параметрами
Join Video – склейка двух видео файлов
Cut Video – вырезание из видео заданного сегмента
Video Effect – преобразование видео с наложением видео эффекта
Audio Effect — преобразование видео с наложением аудио эффекта
Streaming from Camera – трансляция видео с камеры на сервис Wowza
Get Media File Info – получение информации о медиа файле
Наигравшись с сэмплами, можно начинать изучать внутренности, первым кандидатом на разбор будет
Transcode Video
Этот пример содержит две активности
- ComposerTranscodeActivity – обеспечивает выбор видео файла и отображает его на предпросмотре, ничего интересного
- ComposerTranscodeCoreActivity – выводит подробную информацию о выбранном видео файле, выполняет его преобразование
Ключевым элементом в данном примере является класс MediaComposer, который принимает на вход один или несколько медиа файлов и преобразовывает их в соответствие с заданными параметрами.
Для того, чтобы преобразовать видео, нам необходимо выполнить пять простых шагов.
1. Создать объект MediaComposer
MediaComposer mediaComposer = new AndroidMediaObjectFactory(getApplicationContext());
2. Указать путь к исходному и результирующему файлам
String srcPath = “…”;
String dstPath = “…”;
mediaComposer.addSourceFile(srcPath);
mediaComposer.setTargetFile(dstPath);
3. Задать параметры результирующего видео
// Создаем и инициализируем видео формат
// Формат видео
String videoMimeType = “video/avc”;
// Ширина кадра
int videoFrameWidth = 640;
// Высота кадра
int videoFrameHeight = 480;
// Битрейт в килобайтах
int videoBitRate = 5000;
// Частота кадров в секунду
int videoFrameRate = 30;
// Частота ключевых кадров
int videoIFrameInterval = 1;
VideoFormatAndroid videoFormat = new VideoFormatAndroid(videoMimeType, videoFrameWidth, videoFrameHeight);
videoFormat.setVideoBitRateInKBytes(videoBitRate);
videoFormat.setVideoFrameRate(videoFrameRate);
videoFormat.setVideoIFrameInterval(videoIFrameInterval);
// Задаем видео формат
mediaComposer.setTargetVideoFormat(videoFormat);
// Создаем и инициализируем аудио формат
// Формат Audio
String audioMimeType = “audio/mp4a-latm”;
// Частота аудио сэмплов
int audioSampleRate = 48000;
// Количество уадио каналов
int audioChannelCount = 2;
// Аудио профайл
int audioProfile = MediaCodecInfo.CodecProfileLevel.AACObjectLC;
AudioFormatAndroid audioFormat = new AudioFormatAndroid(audioMimeType , audioSampleRate, audioChannelCount);
audioFormat.setAudioBitrate(audioBitRate);
audioFormat.setAudioAacProfile(audioProfile);
// Задаем аудио формат
mediaComposer.setTargetAudioFormat(audioFormat);
4. Реализовать интерфейс MediaComposer.IProgressListener
Преобразование видео в MediaComposer происходит асинхронно, в отдельном потоке. Для того, чтобы приложение могло получать уведомление о начале и окончании процеса преобразования, получало сообщения о прогрессе, возникающих ошибках, оно должно реализовать интерфейс MediaComposer.IProgressListener и передать указатель на него объекту MediaComposer.
public MediaComposer.IProgressListener progressListener = new MediaComposer.IProgressListener() {
@Override
public void onMediaStart() {
// Процесс преобразования начался
}
@Override
public void onMediaProgress(float progress) {
// Текущий прогресс
}
@Override
public void onMediaDone() {
// Процесс преобразования завершился по завершению
}
@Override
public void onMediaPause() {
// Процесс преобразования был приостановлен
}
@Override
public void onMediaStop() {
// Процесс преобразования остановлен
}
@Override
public void onError(Exception exception) {
// Процесс преобразования завершился с ошибкой
}
};
// Передаем указатель на интерфейс в MediaComposer
mediaComposer.addProgressListener(progressListener);
5. Запуск процесса преобразования
Финальный шаг, на котором запускается процесс преобразования с заданными параметрами.
mediaComposer.start();
Да, кода получилось немало, но в основном он относится к передаче параметров кодирования и обработке текущего состояния. Опять же, если сравнивать с реализацией с использованием «штатных» классов Android, таких как MediaCodec, MediaExtractor, MediaMuxer, то кода в нашем примере получилось несоизмеримо меньше.
Преобразование видео — это не единственная модель использования Media Pack. В следующих статьях мы расскажем, как с помощью класса GLCapture вы можете добавить возможность захвата и кодирования видео в Android приложения, использующие Open GL или базирующиеся на таких популярных фреймворках, как Unity и libGDX.
Автор: Terror