2

У меня есть несколько видео, записанных с моего телефона Android. Они очень похожи. Например:

Я применяю этот фильтр к каждому из них:

ffmpeg -i original0.mp4 -filter_complex "crop=720:720:280:0, scale=640:640, transpose=1" -threads 3 -preset ultrafast -strict -2 -y processed0.mp4`

Результаты:

Результирующие видео в порядке. Затем я хочу объединить их в разные комбинации, например: original0 -> original1 -> original2 , original1 -> original0 -> original2 и так далее. Я использую эту команду для этого:

ffmpeg -f concat -i tmp.txt -codec copy -threads 3 -strict -2 -y combination.mp4

Любые комбинации processed0.mp4 и processed1.mp4 работают нормально. Но если я добавляю processed2.mp4 к комбинации - полученное видео будет повреждено:

Все видео записываются одинаково с интервалом в несколько секунд, и одинаковая комбинация оригинальных видео работает хорошо. Поэтому мне интересно, что не так с original2 или processed2 и как это исправить? Возможно, мне нужно добавить некоторые флаги при применении фильтров? Я предполагаю, что это происходит из-за временных отметок.

1 ответ1

4

Эта проблема

Ваши входные данные различаются по частоте кадров (см. Выходные данные консоли ffmpeg ), и я считаю, что мультиплексор MP4 не поддерживает переменную частоту кадров.

Несколько решений

Вы также можете:

  • использовать другой формат контейнера, такой как Matroska (.mkv), как для обработанных файлов, так и для конечного вывода, или

  • добавьте фильтр fps к вашим графам фильтров, чтобы дать каждому обработанному файлу общую частоту кадров:

    -filter_complex "crop=720:720:280:0, scale=640:640, transpose=1, fps=30"
    

Другое барахло

  • -threads 3 и -strict -2 ничего не делают при потоковом копировании (-c copy).

  • libx264, кодер H.264, автоматически вычисляет оптимальное количество потоков по умолчанию, поэтому форсирование определенного значения может быть неоптимальным.

  • Если вы решите выводить в MP4, то подумайте о добавлении -movflags +faststart в вашу окончательную команду вывода. Это полезно при просмотре через прогрессивную загрузку; в противном случае весь файл должен быть полностью загружен перед началом воспроизведения.

  • В комментарии вы упомянули фильтрацию аудио и видео отдельно. Простой пример может помочь:

    ffmpeg -i input0 -i input1 -filter_complex \
    "[0:v]hflip,negate[bg]; \
     [1:v]vflip,hue=s=0,scale=120:-1[fg]; \
     [bg][fg]overlay[v]; \
     [0:a]aphaser,flanger[a]" \
    -map "[v]" -map "[a]" -movflags +faststart output.mp4
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .