Я записал видео с камеры в своем приложении и сохранил в памяти устройства. Теперь я хочу изменить видео, чтобы оно воспроизводилось с обратной стороны. Если видео составляет 10 секунд, то последний кадр на 10-й секунде станет первым кадром, и он начинает играть оттуда до первого второго кадра. Я хочу сохранить обратное видео в файле. Как я должен продолжать?
Обратное видео в android
Ответ 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:
- http://hiteshsondhi88.github.io/ffmpeg-android-java/
- https://github.com/guardianproject/android-ffmpeg
Стоит осознавать, что это займет много времени на мобильном устройстве - если у вас есть возможность загрузиться на сервер и сделать разворот там, это может быть быстрее.