Какая связь между MediaExtractor, MediaCodec и MediaMuxer в Android SDK?

Я пытаюсь провести несколько экспериментов по глубокому обучению на Android на образцах видео. И я застрял в ремиксах видео. У меня есть пара вопросов, чтобы упорядочить информацию в голове :) Я прочитал несколько страниц: https://vec.io/posts/android-hardware-decoding-with-mediacodec и https://bigflake.com/mediacodec/#ExtractMpegFramesTest но все равно у меня бардак.

Мои вопросы:

  1. Могу ли я прочитать видео с помощью MediaExtractor, а затем передать данные MediaMuxer, чтобы сохранить видео в другом файле? Без использования MediaCodec?
  2. Если я хочу изменить кадры перед сохранением, могу ли я сделать это без использования Surface? Просто изменив ByteBuffer? Я предполагаю, что мне нужно декодировать данные из MediaExtractor, затем изменить содержимое, а затем закодировать его в MediaMuxer.
  3. Является ли sample таким же, как frame в контексте метода MediaExtractor::readSampleData?
  4. Нужно ли мне расшифровывать образец?

person 404pio    schedule 22.07.2020    source источник


Ответы (1)


Вот краткое описание того, что делает каждый класс:

  • MediaExtrator: извлекает закодированные видео/аудиоданные
  • MediaCodec: в зависимости от того, как он настроен, он может быть декодером или кодировщиком.
  • MediaMuxer: мультиплексирует потоки данных в выходной файл.

Вот как обычно должен выглядеть ваш конвейер:

MediaExtractor -> MediaCodec (как декодер) -> Ваше редактирование -> MediaCodec (как кодировщик) -> MediaMuxer

Чтобы ответить на ваши вопросы:

  1. MediaExtractor предоставит вам закодированные данные, и если вы хотите что-то с ними сделать, вам придется декодировать их с помощью MediaCodec.
  2. Возможно, это можно сделать без поверхности, но это будет довольно ограничено. Поверхности - это путь. Дополнительную информацию можно найти здесь: Редактирование кадров и кодирование с помощью MediaCodec
  3. Образец может быть видеокадром или звуковым образцом.
  4. Да, вам нужно декодировать образцы, чтобы редактировать их
person l-l    schedule 08.08.2020