- PVSM.RU - https://www.pvsm.ru -

Intel INDE Media Pack

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

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

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

Скачать библиотеку можно, используя ссылку на официальной странице Intel INDE [2]. После установки менеджера 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 [3]
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 [4] и libGDX [5].

Автор: Terror

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/58106

Ссылки в тексте:

[1] обзорной статье про Intel INDE: http://habrahabr.ru/company/intel/blog/216495/

[2] Intel INDE: http://software.intel.com/en-us/intel-inde

[3] Wowza: http://www.wowza.com/

[4] Unity: https://unity3d.com/

[5] libGDX: http://libgdx.badlogicgames.com/

[6] Источник: http://habrahabr.ru/post/216545/