Можете ли вы вставить текст из файла в режиме реального времени с помощью потоковой передачи ffmpeg?

#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