Обратное видео в android

Я записал видео с камеры в своем приложении и сохранил в памяти устройства. Теперь я хочу изменить видео, чтобы оно воспроизводилось с обратной стороны. Если видео составляет 10 секунд, то последний кадр на 10-й секунде станет первым кадром, и он начинает играть оттуда до первого второго кадра. Я хочу сохранить обратное видео в файле. Как я должен продолжать?

Ответ 1

Спасибо Мику за то, что он дал мне идею использовать ffmpeg для реверсирования видео.

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

Как написано в моем сообщении в блоге,

Для реверсирования видео сначала нужно разделить видео на сегменты продолжительностью 10 секунд или меньше, потому что команда обратного видео для ffmpeg не будет работать в течение длительного времени, пока ваше устройство не будет иметь 32 ГБ ОЗУ.

Следовательно, чтобы обратить вспять video-

1. Разделить видео на сегменты продолжительностью 10 секунд или меньше.

2. Переверните сегментированные видеоролики

3.Concatenate перевернутые сегментированные видео в обратном порядке.

Для разделения видео на сегменты продолжительностью 6 секунд мы можем использовать ниже command-

String [] complexCommand = {"-i", inputFileAbsolutePath, "-c: v", "libx264", "-c rf", "22", "-map", "0", "[CN04 ] "," 6 "," -g "," 9 "," -sc_threshold "," 0 "," -force_key_frames "," expr: gte (t, n_forced * 6) "," -f "," segment ", outputFileAbsolutePath};

Вот,

-c: v libx264

кодирует все видеопотоки с помощью libx264

-c ВЧ

Установите качество для режима постоянного качества.

-segment_time

время для каждого сегмента видео

-g

Размер GOP

-sc_threshold

установить порог изменения сцены.

-force_key_frames expr: gte (t, n_forced * n)

Принуждение ключевого кадра каждые n секунд

После сегментирования видео нам нужно отменить сегментированные видео. Для этого нам нужно запустить цикл, в котором каждый сегментированный видеофайл будет отменен.

Чтобы перевернуть видео со звуком (без удаления его звука), мы можем использовать ниже command-

Строковая команда [] = {"-i", inputFileAbsolutePath, "-vf", "reverse", "-af", "reverse", outputFileAbsolutePath};

Чтобы отменить видео со звуком, удалив его звук, мы можем использовать ниже command-

Строковая команда [] = {"-i", inputFileAbsolutePath, "-an", "-vf", "reverse", outputFileAbsolutePath};

Чтобы перевернуть видео без звука, мы можем использовать ниже command-

Строковая команда [] = {"-i", inputFileAbsolutePath, "-vf", "reverse", outputFileAbsolutePath};

После реверсирования сегментированных видеороликов нам нужно объединить обратные сегментированные видео в обратном порядке. Для этого мы сортируем видео на основе последнего измененного файла с помощью Arrays.sort (файлы LastModifiedFileComparator.LASTMODIFIED_REVERSE).

Затем, чтобы соединить реверсированные сегментированные видео (со звуком), мы можем использовать ниже command-

String command [] = {"-i", inputFile1AbsolutePath, "-i", inputFile2AbsolutePath....., "-i", inputFileNAbsolutePath, "-f ilter_complex", "[0: v0] [0: a0] [1: v1] [1: a1]... [N: vN] concat = n = N: v = 1: a = 1 [v] [a], "-map", "[v ] "," -map "," [a] ", outputFileAbsolutePath};

Чтобы объединить обратные сегментированные видео (без звука), мы можем использовать приведенные ниже command-

String command [] = {"-i", inputFile1AbsolutePath, "-i", inputFile2AbsolutePath....., "-i", inputFileNAbsolutePath, "-f ilter_complex", "[0: 0] [1: 0] [2: 0]... [N: 0] concat = n = N: v = 1: a = 0 ", outputFileAbsolutePath};

Вот,

-f ilter_complex [0: v0] [0: a0] [1: v1] [1: a1]... [N: vN] сообщает ffmpeg, какие потоки отправлять в фильтр concat. В приведенном выше случае видеопоток 0 [ 0: v0] и аудиопоток 0 [0: a0] от входа 0, видеопоток 1 [1: v1] и аудиопоток 1 [1: v1] от входа 1 и т.д.

фильтр concat используется для конкатенации аудио- и видеопотоков, объединяя их друг с другом один за другим. Фильтр принимает следующие параметры:

N

Задайте количество сегментов. Значение по умолчанию - 2.

v

Установите количество выходных видеопотоков, а также количество видеопотоков в каждом сегменте. Значение по умолчанию: 1.

Задайте количество выходных аудиопотоков, а также количество аудиопотоков в каждом сегменте. Значение по умолчанию - 0.

Ответ 2

Если вы готовы использовать ffmpeg, вы можете использовать этот подход - он существенно разбивает видео на фреймы и затем строит его снова в обратном порядке:

Существует несколько способов использования ffmpeg в Android, но подход "обертки" - это тот, который я нашел разумным сочетанием производительности и простоты использования. Например, оболочка ffmpeg для Android:

Стоит осознавать, что это займет много времени на мобильном устройстве - если у вас есть возможность загрузиться на сервер и сделать разворот там, это может быть быстрее.