Jak mogę użyć FFmpeg, aby dodać tekst / zmienny tekst do wideo na żywo?

2

Jestem w stanie dodać tekst do wideo na moim dysku twardym, zanim go odłożę ... za pomocą polecenia.

ffmpeg -y -i IMG_0696.MOV -acodec libmp3lame -vcodec msmpeg4 \
-b:a 192k -b:v 1000k -ar 44100 \
-vf "drawtext=text=string1 string2 string3 string4 string5 string6 string7 :expansion=normal:fontfile=/Windows/Fonts/cambriai.ttf: y=0:x=h-(2*lh)-n: fontcolor=white: fontsize=40: box=1: boxcolor=0x00000000@1" \
-an IMG_0696.avi

Teraz chcę dodać różne teksty w różnych momentach. Powinien być odczytany z pliku, który ma format format: Na przykład

00:00:10: google
00:00:20: yahoo
00:00:30: msft
.
.
.
00:00:60: amzn
.
.
.
00:05:30: java

Czy istnieje sposób, aby ffmpeg odczytał plik i dodał tekst w określonym czasie? Ostatecznie chciałbym dodać symbol wideo na żywo przed jego nadaniem.

użytkownik763410
źródło
Nie jestem pewien, czy istnieje sposób na zrobienie tego „w locie”, ale jeśli chcesz dodać tekst w różnych odstępach czasu, lepiej jest użyć formatu podobnego do napisów, takiego jak .srt i bezpośrednio wklejać, aby powiedzieć kontener mkv. Przykład: ffmpeg -i infile -i subtitle.srt -scodec copy -acodec copy -vcodec copy outfile.mkv. Wyszukaj format srt.
Rajib

Odpowiedzi:

1

Z kodu źródłowego drawtextfiltru (z libavfilter/vf_drawtext.cdrzewa źródłowego) wydaje się, że istnieje textfileparametr, który może określić ścieżkę do pliku zawierającego ciąg, który ma zostać narysowany (w przeciwieństwie do ustawiania textparametru jak w przykładzie). Możesz poeksperymentować z przekazaniem ścieżki textfilepliku jako i zaktualizowaniem pliku podczas wyświetlania wyjścia wideo.

Potrzebny byłby również inny program / demon działający równolegle w celu aktualizacji pliku (który zawierałby tylko bieżący tekst do wyświetlenia), ale ten program byłby dość trywialny, zakładając, że można go zsynchronizować z zegarem systemowym.


Alternatywnie, można zmodyfikować drawtextsam filtr, aby wyświetlić konkretny ciąg w oparciu o bieżący Timecode (który jest dostępny do filtrów FFmpeg). Chociaż wymagałoby to modyfikacji kodu źródłowego filtru i ponownej kompilacji od podstaw, uniknęłoby to również użycia oddzielnego programu / demona działającego równolegle (ponieważ twój własny kod byłby wywoływany, gdy FFmpeg próbuje narysować ciąg).

Zakładając jednak, że textfileparametr działa (czytaj: jest aktualizowany w każdej klatce), prawdopodobnie byłaby to lepsza metoda, ponieważ prosty demon do aktualizacji pliku tekstowego mógłby zostać napisany w języku skryptowym, takim jak Python.

Przełom
źródło
Dziękuję bardzo. Wypróbowałem opcję ... ale zachowuje się jak opcja tekstowa. Plik wydaje się być odczytywany naraz (spójrz na plik load_textfile () lub wiersz 401). Jeśli nie otrzymam lepszych odpowiedzi, spróbuję zmodyfikować ffmpeg i sprawdzić, czy działa.
user763410