2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт...

29
Опыт работы с Android Media Framework на примере приложения Cinepic

Transcript of 2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт...

Опыт работы с Android Media Framework

на примере приложения Cinepic

CINEPIC

● Собрать на Android

● API 18+

● Совместимо с 80%+ устройств

2

Фон клипа

● Подготовка фото

● Применение жестов Scale Up/Down, Translate

● Сохранение матрицы трансформации

3

● Очень не надежно

● Ресурсоемко

● Медленно

Превью в ячейке. Шаг первый

4

SurfaceView MediaPlayer

VideoView

+

=

● Надежно но не быстро

Превью в ячейке. Шаг второй

5

TextureView MediaPlayer

TextureVideoView

+

=

UI Thread

Превью в ячейке. Шаг третий

6

TextureView MediaCodec+ <=PlaybackController

AsyncThread

Кадры

То что нужно

● Максимально быстро

● Минимум памяти

● Минимум поддержки

● … но трудоемко

7

Трансформация видео во View

8

TranslateListener

ScaleListener

(-x,-y)

(0, 0)

Rect ImageBounds

ViewBounds

Эффекты

9

TextureView=>VideoStream <=

OpenGL ES ObjectAnimator

Fade In/Out

Scale Up

Ffmpeg

10

● Тяжелая

● Сложно поддерживать

ffmpeg moduleInput params + Video Resized video

Транскодирование из коробки

11

MediaDecoder MediaEncoder=> => MediaMuxer

Intel Inde

● Компактная

● Может заменять кадры

● Есть сэмплы

● На основе MediaCodec

● Рендерит с помощью OpenGL ES

12

Извлечение кадров

13

MediaDecoder Surface DataExtractor FrameSaver

OpenGL ES

OpenGL ES

Заготовка Preview

14

Scene Drawer Surface MediaEncoder MediaMuxer

Рендеринг клипа

15

Frame DrawerTile Frame Composer

Intel Inde frame Composer

0 ms 15000 ms….время

Frame Provider

N times

Результаты работы c Video

16

Плюсы

● Совместимость с большинством устройств

● Скорость рендеринга и отрисовки

● Минимальное использование памяти

● Поддержка популярных видео форматов

Минусы

● Время подготовки preview

17

Аудио в Cinepic

Пользователь хочет:

● Загружать в проект существующий аудиофайл

● Записывать звуковой фрагмент используя микрофон смартфона

● Выбирать пятнадцати-секундный фрагмент и добавлять его к видео в

качестве звуковой дорожки

● Видеть waveform при записи и редактировании

18

Аудио в Android

19

Формат

20

Конвертация

● MediaCodec?

● ffmpeg?

● aac-encoder?

MP3 m4a

21

Конвертация

MP3 wav m4a

JLayer decoder

MediaCodec + MediaMuxer

22

Конвертация

Создание кодека по имени кодера/декодера:

● OMX.google.aac.encoder

Создание кодека по MIME- типу

● audio/mp4a-latm

● Формирование очереди входных данных:

codec.queueInputBuffer(inputBufIndex, 0, bytesRead, presentationTimeUs, 0);

● Теоретический рассчёт времени смещения:

presentationTimeUs = 1000000 * (totalBytesRead / SAMPLING_RATE);

● Фактический рассчёт времени смещения:

presentationTimeUs = 1000000 * ((totalBytesRead / (SAMPLING_RATE/10000)) / SAMPLING_RATE);

Конвертация

23

MP4Parser

● Вырезаем

Movie srcAudio = MovieCreator.build(srcAudioPath);Track track = srcAudio.getTracks().get(0);Movie cropped = new Movie();cropped.addTrack(new AppendTrack(new CroppedTrack(track, startSample, endSample)));

● Добавляем

Movie src = MovieCreator.build(srcVideo);Movie audio = MovieCreator.build(croppedAudio);src.addTrack(audio.getTracks().get(0));

24

Визуализация

MediaRecorder

● getMaxAmplitude()

● ~60ms

● 32767

25

RingDroid

● < 2.7.2 - CheapMP3, CheapAAC!● 2.7.+ SoundFile :(

26

Визуализация

Итоги

27

28

Вопросы?

29