Компания
311,61
рейтинг
31 марта 2014 в 10:51

Разработка → 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.
Автор: @Terror
Intel
рейтинг 311,61

Комментарии (7)

  • +1
    Преобразование видео на планшете. Все это мощно и круто, но немного напоминает троллейбус из буханки хлеба.
    И в самом деле — зачем?
    — выложить вКонтактик через медленное 3G-соединение?
    — передать с планшета на телефон, а с телефона на часы?
    — погреться в дороге холодными зимними днями?
    • +1
      Как вариант — для фана.
      Например вот, видео записано или на планшетик, или на телефон:
    • +1
      Сейчас очень много публичных wifi точек с приличной скоростью, причем, еще и бесплатных. Особенно во всяких заведениях общепита. Выкладывать видео оттуда — одно удовольствие. Выпил-снял-выложил :)
      Еще очень популярно записывать видеоролики геймплея из игр, в которые играют на планшетах. Зачем — это уже вопрос не к нам.
      • +1
        Вот поосторожнее бы с «Выпил-снял-выложил». ИМХО, сей процесс как раз усложнять и замедлять надобно, чтобы, протрезвев, не сильно опечалиться от опубликованного :)
        • +1
          Добавить голосовое распознавание, перед загрузкой видео попросить произнести «фиолетовенкий» :)
    • +1
      Транскодирование видео одна из моделей использования, один из блоков. Используя остальные можно, например, дать возможность пользователю склеить несколько роликов в один, выбирая только нужные фрагменты, наложить видео эффекты.

      Зачем для этого использовать планшет или смартфон? А почему бы и нет, если их производительность сейчас такова, что позволяет обрабатывать видео с приемлемой производительностью, избавляя пользователя от необходимости предварительно грузить видео на PC и обрабатывать на нем.
  • 0
    Расскажите подробней про публикацию на вовзу?
    Это какая-то вовза-специфичная функциональность, или подойдет любой другой rtmp-сервер?
    Сколько усилий тратится на поддержание интеграции? (с обоих стороны, с интела, с вовзы)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка