#python #ffmpeg #streaming
#python #ffmpeg #потоковая передача
Вопрос:
У меня есть этот код, который я использую для потоковой передачи файла и помещаю название показа видео в определенное время видео (name_of_show ) в верхней части экрана, а в нижней части экрана он берет название шоу из video_title.txt и помещает его в нижней части экрана.
Что я хочу сделать, так это найти способ с интервалом, скажем, в 1 или 2 минуты, извлекать любой текст, который в данный момент находится в video_title.txt и поместите его в видео на несколько секунд.
Я бы обновил video_title.txt из другой программы на Python. Вот мой текущий код ниже.
command = [
"ffmpeg" , "-re" , "-i" , video[0] ,
"-vf" , "[in]drawtext=fontsize=40:fontcolor=white:box=1:boxcolor=black@0.8:boxborderw=5:fontfile=/home/fonts/timeless.ttf: text='" name_of_show "':x='W-(W tw)*mod(t,10)/10':y='H/20':enable='between(t,50,70)',drawtext=fontsize=20:fontfile=/home/fonts/timeless.ttf:textfile=/video_title.txt:fontcolor=white:box=1:boxcolor=black@0.8:boxborderw=5:x=W-w 5:y=h-th-50:enable='1'[out]"
"-vcodec" , "libx264", "-pix_fmt", "yuv420p",
"-preset" , "medium" , "-r" , "30" , "-g" , "48" , "-b:v" , "2500k" ,
"-acodec" , "libmp3lame" , "-ar" , "44100", "-threads" , "6" ,
"-q:a" , "3" , "-b:a" , "712000" ,"-bufsize", "512k" , "-f" ,
"flv" , STREAM_URL,
В конечном итоге эффект, которого я пытаюсь достичь, — это длинный поток, скажем, 1 час на twitch / YouTube, где кто-то может отправить текстовое сообщение, и оно появится в потоке.
Ответ №1:
Используйте опции reload=1
и textfile
в drawtext. Из документации фильтра drawtext:
reload
Если установлено значение 1, текстовый файл будет перезагружаться перед каждым кадром. Обязательно обновите его атомарно, иначе он может быть прочитан частично или даже потерпеть неудачу.
textfile
Текстовый файл, содержащий текст для рисования. Текст должен представлять собой последовательность символов в кодировке UTF-8.
Этот параметр является обязательным, если в параметре не указана текстовая строкаtext
.
Если указаны обаtext
иtextfile
, возникает ошибка.
Пример:
ffmpeg -i input.mp4 -vf "drawtext=texfile=mytext.txt:reload=1:fontsize=22:fontcolor=white" output.mp4
Для атомарного обновления вы можете использовать mv
или аналогичный:
mv temp.txt mytext.txt