В моем приложении для Android я хочу сжать видео mp4, изменив его разрешение, битрейт. Я не хочу использовать FFmpeg (потому что я не хочу использовать NDK), поэтому решил использовать MediaCodec API.Как сжать mp4-видео с помощью MediaCodec Android?
Вот мои логические шаги:
- Извлечение видео файл с MediaExtractor, а затем декодировать данные.
- Создайте новый кодер с моим новым разрешением, битрейтом и кодировкой данных.
- Использование MediaMuxer для создания нового файла mp4.
Моя проблема: я не знаю, как настроить соединение между выходом декодера и входом энкодера. Я могу декодировать видео на поверхность или закодировать новое видео с поверхности. Но я не понимаю, как их подключить.
Я читаю эти ссылки: Android MediaCodec: Reduce mp4 video size, Video compression on android using new MediaCodec Library и пример из Bigflake: https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
Может кто-нибудь дать мне ясное объяснение того, что я должен делать?
Чтобы сделать прямую копию, вы просто получите входную поверхность от энкодера (через 'getInputSurface()') и передайте это декодеру в качестве выходной поверхности (через 'configure()'). – fadden
Проверьте этот ответ http://stackoverflow.com/questions/31796711/fast-video-compression-like-whatsapp/31823187#31823187 –
API MediaCodec довольно неясен и недокументирован. Я начал щедрость по этому вопросу. Хопелли кто-то опубликует класс, который у них уже есть. Большой файл mp4 на диске -> Маленький файл mp4 на диске. Все с использованием MediaCodec. Это спасет бесчисленные жизни! (ну, может быть, нет, но я уверен, что сэкономил бы мой ^^) – Taiko