У меня есть большой видеофайл (2,2 ГБ), и одна часть видео ориентирована неправильно: первая часть в порядке, а вторая часть повернута на 180 градусов (480 * 1066 пикселей). Для решения проблемы я использовал FFmpeg.
Я использовал эту команду, чтобы разделить видеофайл на две части
ffmpeg -i input.mp4 -t 00:14:36 -c copy 1.mp4 -ss 00:14:36 -c copy 2.mp4
Я изменил метаданные второго видеофайла так, чтобы он соответствовал ориентации первого при чтении:
ffmpeg -i 2.mp4 metadata: v: s: 0 "rotate = 180" -c copy 20 .mp4
Я объединил 2 файла с помощью этой команды:
ffmpeg -f concat -i merge.txt -c copy OUTPUT-MERGED.mkv
Где merge.txt перечисляет два файла: 1.mp4 и 20.mp4 .
Проблема в том, что это не работает; изменение метаданных второго видеофайла, похоже, не принимается во внимание, когда ffmpeg объединяет два файла в конце, результат строго такой же, как у входного видеофайла.
Есть ли способ сделать то, что я хочу, без кодирования одного из двух файлов?
Входной файл содержит следующую информацию:
Metadata:
rotate : 90
creation_time : 2021-05-07T09:26:43.000000Z
handler_name : VideoHandle
Side data:
displaymatrix: rotation of -90.00 degrees
И два отдельных файла содержат эту информацию:
1.mp4
Metadata:
rotate : 90
handler_name : VideoHandle
Side data:
displaymatrix: rotation of -90.00 degrees
20.mp4
Metadata:
rotate : 180
handler_name : VideoHandle
Side data:
displaymatrix: rotation of -180.00 degrees
Это не способ поворачивать часть файла. Метаданные применяются ко всему файлу. Если вы разделите файл, а затем измените метаданные второй части, эти метаданные будут потеряны, если вы снова объедините эту часть с первой частью.
Для поворота части видео ваш единственный вариант - перекодировать эту часть.Вам нужно будет повернуть изображение, а затем подогнать его под размер кадра первой части, вставив черные полосы или обрезав повернутое изображение. Результат необходимо перекодировать с использованием того же кодекса, что и в первой части, в новый видеофайл. Затем этот новый видеофайл можно добавить к первой части.
Вы можете сделать это с помощью проигрывателя, такого как ffplay
или mpv
:
ffplay -vf "rotate=180*PI/180:enable='between(t,3,6)'" input.mp4
Поскольку он просто вращается при воспроизведении, он поворачивает видео без перекодирования. Выходной файл не производится.
Единица измерения находится в радианах. Измените первый экземпляр 180
на любую нуженную степень вращения. Для 180 градусов вы можете просто использовать rotate=PI
.
Для получения дополнительной информации см. документацию о параметрах rotate filter и enable
.