FFMpeg: как использовать между (), чтобы выбрать последнюю секунду? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь применить подпись, используя drawtext, который должен исчезнуть за одну секунду до окончания видео:

ffmpeg -i input.mp4 -vf "drawtext=enable='between(t,0,5)':fontfile=font.ttf:text='Some caption':x=60:y=640:fontsize=40:fontcolor=#f0f0f0@0.9" -vcodec libx264 -crf 27 -preset ultrafast -strict -2 -acodec copy output.mp4

Проблема в том, что я заранее не знаю длину видео.Я пытался использовать'ween (t, 0, -1) ', но это не работает, заголовок никогда не появляется.Кто-нибудь знает, есть ли способ сделать это без необходимости сначала открывать видео, чтобы проверить длину, и только после этого нарисовать подпись?Заранее спасибо!

1 Ответ

0 голосов
/ 13 мая 2019

FFmpeg не передает длительность потока фильтрам, поэтому это нужно сделать окольным путем.

FFmpeg имеет функцию sseof, которая может искать с конца файла.У этого также есть опция copyts, чтобы поддержать метки времени.Итак, мы загружаем вход дважды, один раз - полный вход, а другой - только последнюю секунду.Затем мы рисуем текст на всем 1-м входе, но накладываем последнюю секунду на 2-й вход, который из-за сохраненных временных меток будет сожжен на месте.

ffmpeg -copyts -i input.mp4 -sseof -1 -i input.mp4 -filter_complex  "[0]drawtext=fontfile=font.ttf:text='Some caption':x=60:y=640:fontsize=40:fontcolor=#f0f0f0@0.9[txt];[txt][1]overlay" -vcodec libx264 -crf 27 -preset ultrafast -acodec copy output.mp4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...