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 через ваш собственный сервер может сделать вас вещательной станцией, так мне сказали.
надеюсь, это поможет вам в принятии решений