2015-06-15 2 views
13

В моем приложении для Android я хочу сжать видео mp4, изменив его разрешение, битрейт. Я не хочу использовать FFmpeg (потому что я не хочу использовать NDK), поэтому решил использовать MediaCodec API.Как сжать mp4-видео с помощью MediaCodec Android?

Вот мои логические шаги:

  1. Извлечение видео файл с MediaExtractor, а затем декодировать данные.
  2. Создайте новый кодер с моим новым разрешением, битрейтом и кодировкой данных.
  3. Использование 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

Может кто-нибудь дать мне ясное объяснение того, что я должен делать?

+0

Чтобы сделать прямую копию, вы просто получите входную поверхность от энкодера (через 'getInputSurface()') и передайте это декодеру в качестве выходной поверхности (через 'configure()'). – fadden

+0

Проверьте этот ответ http://stackoverflow.com/questions/31796711/fast-video-compression-like-whatsapp/31823187#31823187 –

+0

API MediaCodec довольно неясен и недокументирован. Я начал щедрость по этому вопросу. Хопелли кто-то опубликует класс, который у них уже есть. Большой файл mp4 на диске -> Маленький файл mp4 на диске. Все с использованием MediaCodec. Это спасет бесчисленные жизни! (ну, может быть, нет, но я уверен, что сэкономил бы мой ^^) – Taiko

ответ

9

Я использовал это, чтобы посмотреть, как манипулировать видео в андроиде: https://github.com/hoolrory/AndroidVideoSamples, проверьте VideoResampler.java на CommonVideoLibrary.

+0

Пример использования: VideoResampler resampler = new VideoResampler(); resampler.addSamplerClip (новый SamplerClip (inputUri)); resampler.setOutput (outputUri); resampler.setOutputResolution (Resolution.RESOLUTION_720P.getWidth(), Resolution.RESOLUTION_720P.getHeight()); \t \t try { \t \t resampler.start(); \t \t} catch (Throwable e) { \t \t e.printStackTrace(); \t \t} Это работает как волшебство !! – Taiko

+3

@Taiko Нет звука после сжатия. Отсутствует ли какой-либо код? – SkyWalker

+0

@SkyWalker Извините. В моем случае я использовал только видео. Не стесняйтесь обновлять мой пост и аудио! – Taiko

Смежные вопросы