Intel INDE Media Pack

В прошлый раз в обзорной статье про Intel INDE мы упомянули о Media Pack и его ключевых возможностях. В этой статье мы остановимся на нем более подробно.

INDE Media Pack — это библиотека, включающая в себя различные компоненты для работы с аудио и видео. С точки зрения реализации, это — надстройка над медиа компонентами Android, использующая аппаратное ускорение для кодирования и декодирования видео. По сравнению с использованием классов для работы с мультимедиа в Android, она гораздо более проста в использовании, разработчику нет нужды разбираться во всех тонкостях работы медиа кодеков, экстрактора, муксера, только для того, чтобы встроить в свое приложение возможность работы с видео.

Приложения, использующие Media Pack, будут работать на всех архитектурах (ARM, IA), на устройствах, работающих на Android 4.3 и выше.

Скачать библиотеку можно, используя ссылку на официальной странице Intel INDE. После установки менеджера Intel INDE открываем его, выбираем компонент Media, далее Download, после того, как он будет загружен, запускаем установку (Install).

image

По завершении установки в выбранной директории будет создана папка, содержащая все, что нужно для начала работы с Media Pack.

image

Давайте начнем со сборки и запуска примеров, т.к. это самый быстрый и наглядный способ оценить, на что же способен Media Pack. Для этого нам потребуется Eclipse и устройство на Android версии 4.3 или выше.

Запускаем Eclipse далее File -> New -> Project -> Android Project From Existing Code

image

У проекта samples есть зависимость от проекта effects, чтобы Eclipse правильно определил все зависимости, необходимо импортировать сразу оба проекта. Для этого в качестве корневой директории необходимо указать путь к папке samples и отметить оба проекта для импорта — apps и effects.

image

Запускаем импортированный пакет apps как Android приложение, после сборки и запуска приложения появится главная активность приложения, в которой представлены различные модели использования, которые предлагает Media Pack.

image

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 – выводит подробную информацию о выбранном видео файле, выполняет его преобразование


image

Ключевым элементом в данном примере является класс 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.