FFmpeg Drawtext на несколько строк - PullRequest
3 голосов
/ 21 ноября 2011

У меня есть код:

import subprocess , os

ffmpeg = "C:\\ffmpeg_10_6_11.exe"
inVid = "C:\\test_in.avi"
outVid = "C:\\test_out.avi"

if os.path.exists( outVid ):
os.remove( outVid )
proc = subprocess.Popen(ffmpeg + " -i " + inVid + ''' -vf drawtext=fontfile=/Windows/Fonts/arial.ttf:text="onLine1 onLine2 onLine3":fontcolor=white:fontsize=20 -y ''' + outVid , shell=True, stderr=subprocess.PIPE)
proc.wait()
print proc.stderr.read()
os.startfile( outVid )

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

Пожалуйста, помогите. Спасибо

Ответы [ 4 ]

16 голосов
/ 21 июня 2012

Этот ответ, вероятно, немного запоздал для вас, но вы можете указать несколько DrawTextexts для одного файла, используя тег [in] и перечисляя каждый DrawText, используя запятые. Это позволяет вам использовать несколько линий, если вы ориентируете каждый DrawText с помощью соответствующих методов позиционирования. В вашем примере командная строка будет выглядеть примерно так (помещает первую строку в середину экрана и помещает каждую последующую строку на 25 пикселей вниз):

ffmpeg -i test_in.avi -vf "[in]drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine1':x=(w)/2:y=(h)/2, drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine2':x=(w)/2:y=((h)/2)+25, drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine3':x=(w)/2:y=((h)/2)+50[out]" -y test_out.avi
13 голосов
/ 11 октября 2012

Глядя на исходный код в ffmpeg (vs_drawtext.c):

static inline int is_newline(uint32_t c)
{
    return c == '\n' || c == '\r' || c == '\f' || c == '\v';
}

, поэтому вы можете попробовать вставить \f или \v в текстовую строку, соответствующую ^L или^K символов.Например:

-filter_complex "[in] drawtext=fontsize=40:fontcolor=white:fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf:x=(w-tw)/2:y=(h-th)/2:box=1:boxcolor=black@0.5:text='two^Llines'[out]"

^L является фактическим символом Ctrl-L, а не ^ и L, очевидно.

5 голосов
/ 28 ноября 2011

Мне удалось заставить это работать из командной строки, указав параметр 'textfile' и поместив мой текст в этот файл.

См. http://ffmpeg.org/libavfilter.html#drawtext для получения дополнительной помощи.Использование ffmpeg build N-35057-g2c44aed для Windows, но важно то, что у вас установлена ​​последняя версия libavfilter.

3 голосов
/ 22 ноября 2015

Я просто добавил новые строки внутри команды и ffmpeg обработал его правильно.

ffmpeg -i input.avi -vf "[in]drawtext=fontsize=20:text='hello
world':x=(w)/2:y=(h)/2:fontcolor=white[out]" -y out.mp4

Нет необходимости в Ctrl + L, Ctrl + K!

Т.е. я только что нажал Enter после 'привет '.

Вы можете сделать это, отредактировав файл скрипта или даже в командной строке bash.

...