Android-выбор между MediaRecorder, MediaCodec и Ffmpeg

Я работаю над приложением для записи видео и обмена для Android. Технические характеристики приложения являются следующими: -

  • Запись 10 секунд (максимум) видео из приложения (не используя приложение камеры устройства)
  • нет дальнейшего редактирования на видео
  • хранение видео в ведре Firebase Cloud Storage (GCS)
  • загрузка и воспроизведение указанного видео другими пользователями

исследования, я сделал на SO и других источниках для этого я нашел следующее (пожалуйста, поправьте меня, если я ошибаюсь):-

три варианта и их соответствующие функции: -

1.Ffmpeg

  • способен достичь вышеуказанной цели и имеет обширные ответы и объяснения на таких сайтах, как так, однако
  • увеличивает размер APK на 20-30mb (большая библиотека)
  • рискует не работать должным образом на некоторых 64-битных устройств

2.MediaRecorder

  • надежный и поддерживается большинством устройств
  • будет хранить файлы .формат mp4 (если не преобразован в h264)
  • легче для воспроизведения (не требуется расшифровка)
  • добавляет заголовки mp4 и 3gp
  • увеличивает задержку в соответствии с этот вопрос

3.MediaCodec

  • низкий уровень
  • потребуется MediaCodec, MediaMuxer и MediaExtractor
  • вывод в h264 (без использования MediaMuxer для воспроизведения )
  • хорошо для видео манипуляций (хотя, не требуется в моем случае использования)
  • не поддерживается устройствами pre 4.3 (API 18)
  • сложнее реализовать и код (мое мнение - пожалуйста, поправьте меня, если я ошибаюсь)
  • отсутствие обширной информации, учебников, ответов или образцов (Bigflake.com будучи единственным исключением)

потратив на это несколько дней, я все еще не могу понять, какой подход подходит для моего конкретного случая использования. Пожалуйста, уточните, что я должен сделать для моего заявления. Если есть совершенно другой подход, то я тоже открыт для него.

мои самые большие критерии заключаются в том, что процесс кодирования видео будет максимально эффективным, а видео, которое будет храниться в облаке, должно иметь наименьшее возможное использование пространства без ущерба для качество видео.

кроме того, я был бы признателен, если бы вы могли предложить соответствующий формат для сохранения и распространения видео в хранилище Firebase и указать мне учебники или образцы предлагаемого вами подхода.

спасибо заранее! И прости за долгое чтение.

1 ответов


ваш обзор по этой теме применяет его к точке. Я просто добавлю свои 2 цента по этой теме, которые вы могли пропустить как дополнение:

1.FFMpeg

  • + / - Если вы создаете свой собственный, то вы можете уменьшить размер до 2-3 МБ в зависимости от usecae, конечно. Редактирование 6000 строк buildscript требует времени и усилий, хотя

  • ++поддерживает широкий диапазон форматов (почти все)

  • ++результаты одинаковы для каждого устройства

  • ++любое разрешение, поддерживаемое

  • --потребление высокой энергии должное делает SW-En - / Decoding, также делает его медленным. Существует плагин для поддержки lib-stagefright, но он не работает на многих устройствах (по состоянию на май 2016 года)

  • --лицензирование может быть проблематичным в зависимости от вашего местоположения и usecase. Я не юрист, но у нас юридические консультации на эту тему и это довольно conmplex

2. MediaRecorder

  • ++проще всего реализовать (упрощенный доступ к mediacodec/libstagefright) необработанные данные передаются кодировщику напрямую, поэтому не возиться там

  • ++HW ускоряется на большинстве устройств. Делает его быстрым и энергосберегающим.

  • ++задержка применяется только к live потоковое

  • --зависит от реализации HW-производителей

  • --результаты могут отличаться от устройства к устройству

  • ++нет проблем с лицензиями

3.Элементы MediaCodec

  • +/-большинство 2.MediaRecorder относится и к этому (помимо легкости)

  • ++самый гибкий доступ к HW-en - /декодирование

  • --трудно использовать для случаев, которые не были задуманы (например, смешивание видео из разных источников)

  • +/-задержка для потоковой передачи может быть устранена (сложно, хотя)

  • --HW-производители иногда не реализуют вещи правильно (e.g Samsung Galaxy S5 иногда производит SIG-SEV, если в кодер поступают данные из некоторых DLSR. Работает нормально какое-то время, а затем внезапно SIG-SEV. Этот может быть, ошибка dslr, но SIG-SEV ist не предотвратима и сбой приложения, и, в конце концов, его ошибка appdevelopers;))

  • --Если используется без MediaMuxer, вам нужно либо хорошее понимание медиа-контейнеров, либо полагаться на сторонние библиотеки

список, очевидно, не завершен, и некоторые моменты могут быть неправильными. Последний раз я работал с видео почти полгода назад.

Что касается вашего usecase, я рекомендую использование MediaRecorder, так как это самый простой в реализации,поддерживается на всех устройствах, предлагает хорошую опцию качества/размера. FFMpeg дает лучшие результаты для того же размера хранилища, но занимает больше времени (в крайнем случае, DSLR live footage был закодирован в 30 раз быстрее) и потребляет больше энергии. Насколько я понимаю, ваш usecase нет необходимости возиться с MediaCodec, так как вы хотите только кодировать и декодировать.

Я предлагаю использовать VP8 или 9, так как вы не столкнетесь проблемы с лицензированием. Опять же, я не юрист, но распространение H264 через ваш собственный сервер может сделать вас вещательной станцией, так мне сказали.

надеюсь, это поможет вам в принятии решений