Как убрать лишнюю продолжительность видео в ffmpeg при использовании lavfi?

Моя цель — взять клипы продолжительностью более 40 секунд и наложить их на фон, а затем обрезать общее время, как только клипы и фон исчезнут. Он отлично работает, за исключением того, что поиск увеличивается до 24 секунд, даже когда я указываю 21.

ffmpeg -y -framerate 60 -loop 1 -ss 0 -t 21 -i ~/Desktop/FP2.tiff -ss 0 -t 21 -i ~/Desktop/fp.mov -lavfi \
"[0]fade=t=in:st=0:d=1,fade=t=out:st=20:d=1,trim=end=21[bg]; \
[1:v]setpts=(PTS-STARTPTS)+1/TB,fifo,fade=t=in:st=1:d=2,fade=t=out:st=15:d=2[fade]; \
[bg][fade]overlay=10:(main_h-overlay_h)/2:format=rgb[v1]; \
[1:v]setpts=(PTS-STARTPTS)+3/TB,fifo,fade=in:0:120,fade=t=out:st=18:d=2[v2]; \
[v1][v2]overlay=460:(main_h-overlay_h)/2:format=rgb[video]; \
[1:a]adelay=1000|1000,stereotools=muter=1,afade=t=in:st=1:d=2,afade=t=out:st=15:d=2[a1]; \
[1:a]adelay=3000|3000,stereotools=mutel=1,afade=t=in:st=3:d=2,afade=t=out:st=18:d=2[a2]; \
[a1][a2]amix=inputs=2[audio]" \
-map [video] -map [audio] -c:v ffv1 -level 3 -c:a pcm_s16be ~/Desktop/filtergraph.nut

Вы можете увидеть это в ffplay; фон полностью исчезнет на 21-й секунде, но само видео закончится на 24-й секунде. Как сделать, чтобы они точно совпадали? Я знаю, что могу использовать -ssи -tпосле ввода, но этот метод может быть медленным, если вы собираетесь использовать начальную точку после 0.

Я знаю, что могу использовать -ss и -t после ввода -> вы можете сохранить текущую команду и просто добавить -t 21 после ввода.

Ответы (1)

Вы загружаете 21 секунду аудио из видеофайла, а затем применяете adelay=3000|3000, следовательно, 24 секунды. Добавьте atrim=end=21в конце обе цепочки аудиофильтров.

И

Добавьте shortest=1к обоим вашим наложениям.

Я все еще получаю 24 секунды, когда пытаюсь это сделать, даже если я уменьшаю секунды для атрима ниже 21.
Работает здесь. Куда вы поместили атрим?
[1:a]adelay=1000|1000,stereotools=muter=1,fade=t=in:st=1:d=2,fade=t=out:st=15:d=2,atrim=end=21 [а1]; \
Добавление самого короткого сработало, и теперь видео корректно заканчивается после исчезновения фона. ffprobe и ffplay по-прежнему сообщают о длительности 20,98 вместо 21 (последний закодированный кадр говорит 21 плоский), но во всех смыслах это дает ожидаемый результат. Спасибо за помощь!