
Я пытаюсь применить эффект замедленной съемки к серии видео. И далее эти видео будут масштабироваться, дополняться и плавно затухать. Ниже приведена команда, которую я использую для применения замедленной съемки.
ffmpeg -i 1.mp4 -filter_complex "
[0:v]trim=0:5,setpts=PTS-STARTPTS[tv1];
[0:v]trim=5:7,setpts=PTS-STARTPTS[tv2];
[0:v]trim=start=7,setpts=PTS-STARTPTS[tv3];
[tv2]setpts=PTS*2[slow];
[tv1][slow][tv3]concat=n=3:v=1:a=0[out]" -map [out] -c:v libx264 test.mp4
У меня два вопроса.
- Ссылаясь на то,
[tv2]
что хотя он обрезан и применен эффект замедленной съемки, начиная с 5-й секунды, на самом деле он применяет эффект с 4-й секунды. В чем причина этого?
Ниже приведена команда, которую я использую для другой обработки сразу после concatenate в приведенной выше команде.
[concat0]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=out:st=16:d=2:alpha=1,setpts=expr=PTS-STARTPTS+10/TB[va0];
Там мне нужно указать setpts
и я использую совокупную длительность видео до текущего видео.Здесьэто полная команда, которую я для этого использую.
- Как я могу рассчитать длительность видео после применения эффекта замедленной съемки? Например, каково будет увеличение длительности результата видео от 1-й команды, которую я здесь упомянул, в секундах или даже микросекундах?
решение1
Вопрос 1- Команда неполная, так как вы не принимаете во вниманиеаудиотрек, вы изменили PTS только ввидеотрек. Чтобы увидеть разницу, просто попробуйте это:
# no-good, starts from 4th second audio with a frozen video frame
ffmpeg -i in.mp4 -vf trim=5:7 out.mp4
#
# works as expected, both audio and video start at 5th second
ffmpeg -i in.mp4 -vf trim=5:7 -af atrim=5:7 out.mp4
вопрос 2- Это тоже не будет работать так, как ожидалось, по той же причине, но как только вы исправите предыдущую проблему, вот не очень элегантный, но эффективный прием для корреляции времени «до» и «после»:
# overlay the input video with a timer, pulled to the right 200 pixels
ffmpeg -i in.mp4 -f lavfi -i testsrc=n=3 -vf overlay=x=200 in-with-time.mp4
#
# do all your manipulation, and finaly overlay with another timer at x=0
ffmpeg -i in-with-time.mp4 -f lavfi -i testsrc=n=3 -filter_complex "..stuff...,overlay[out]" out.mp4
Это позволяет получить исходное и результирующее время для каждого кадра с точностью до 1 миллисекунды.