Мне было интересно, можно ли вывести видео из нескольких фрагментов входного видео. Например, вывод видео из первых 10 секунд каждой минуты ввода.

Я знаю, что вы можете сделать это программно, вызывая ffmpeg несколько раз с -ss и -t, чтобы создать чанки, а затем объединить их, но возможно ли это сделать одной командой с использованием видеофильтров?

2 ответа2

1

Решено! Вот окончательное решение:

Каждые первые 2 секунды каждой минуты, аудио и видео.

ffmpeg -i fullmovie.mp4 
-vf "select='gte(mod(t\,60),0)*lte(mod(t\,60),2)',setpts='N/(FRAME_RATE*TB)'" 
-vcodec libx264  -crf 23 -acodec libfaac -ac 1 -ab 56k 
-af "aselect='gte(mod(t\,60),0)*lte(mod(t\,60),2)',asetpts='N/(SAMPLE_RATE*TB)'" trailer.mp4
  • select filters оценивает выражение для каждого входного кадра, отбрасывает его, если результат равен 0, и сохраняет его, если результат равен 1
  • мое выражение возвращает 1 в течение первых 2 секунд каждой минуты
  • setpts изменяет PTS каждого кадра / семпла в соответствии с номером кадра / семпла и частотой кадров / семплом
0

Нет, на данный момент это не совсем возможно. Вам придется написать скрипт, который вызывает ffmpeg несколько раз с заданными -ss и -t - по крайней мере, это самый простой способ.

Не забывайте, что позиция -ss имеет значение:

При использовании в качестве параметра ввода (до -i) ищет в этом файле ввода положение. При использовании в качестве параметра вывода (перед именем выходного файла) декодирует, но отбрасывает ввод, пока отметки времени не достигнут позиции. Это медленнее, но точнее.

Я бы сказал, что вы можете использовать фильтр select , который позволяет вам оценивать выражения типа "выбирать только кадры от 10 до 20 секунд", но у меня не получилось, чтобы он работал без дублирования кадров и получения правильных (то есть вырезать ) выход.

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