Creazione di video contenenti testo animato usando solo FFMPEG


5

Dubito che sia possibile, ma sto cercando di trovare un modo per farlo

  1. renderizza dinamicamente il testo e quindi
  2. opzionalmente animalo (semplice movimento da sinistra a destra) e poi
  3. compila il risultato su un altro video.

So che FFMPEG è potente, ma è possibile generare contenuti in modo dinamico come questo usando FFMPEG da solo? Il video verrebbe inserito, ma il testo dovrebbe essere generato interamente utilizzando FFMPEG.


Cosa intendi per dinamica? Il testo è noto quando chiami ffmpeg? Hai visto il filtro drawtext e hai già provato qualcosa? Tieni presente che le domande di programmazione di Node.js sono fuori tema, quindi ho rimosso questa parte dalla tua domanda. Se hai un problema specifico per Node.js, potresti postare su di esso Stack Overflow . Le domande sulla linea di comando di FFmpeg sono qui in argomento, ovviamente.
slhck

si il testo sarebbe noto ... no non ho visto il filtro drawtext ... lo esamineremo ... ogni possibilità che tu possa fornire un rapido snippet di codice?
Bachalo

Risposte:


8

Puoi usare il filtro drawtext .

Testo dinamico

Il testo può essere modificato durante la codifica, se lo si utilizza textfile e reload opzioni:

  • textfile Un file di testo contenente testo da disegnare. Il testo deve essere una sequenza di caratteri con codifica UTF-8.

  • reload Se impostato su 1, il file di testo verrà ricaricato prima di ogni frame. Assicurati di aggiornarlo atomicamente, o può essere letto parzialmente, o addirittura fallire.

Animare

Il testo può muoversi usando espressioni all'interno del x e y opzioni di drawtext. Vedere il documentazione del drawtext per un elenco di costanti e funzioni.

Modifica della timeline

Alcuni filtri, come il drawtext, supportano il enable opzione significa che puoi spegnere e spegnere il filtro. Puoi vedere quali filtri supportano la timeline con:

ffmpeg -filters

Esempio

Se hai un video di input che desideri sovrapporre al testo:

ffmpeg -i input -vf "drawtext=enable='gte(t,3)':fontfile=Vera.ttf:textfile=text.txt:reload=1:y=h-line_h-10:x=(W/tw)*n" output
  • Ciò abiliterà il filtro drawtext dopo 3 secondi
  • Ogni volta text.txt è aggiornato il testo cambierà
  • Le parole si sposteranno sullo schermo da sinistra a destra (faccio schifo a queste espressioni ma tu avrai l'idea)

Se non si dispone di video di input e si desidera solo generare il testo su sfondo nero:

ffmpeg -f lavfi -i "color=color=black, drawtext=enable='gte(t,3)':fontfile=Vera.ttf:fontcolor=white:textfile=text.txt:reload=1:y=h-line_h-10:x=(W/tw)*n" -t 5 output

Qui, -t 5 specifica la lunghezza complessiva dell'output. (Se non specificato, la codifica verrà eseguita per sempre.) Il colore del carattere è impostato su bianco in modo che il testo diventi visibile.


Grazie! avrà bisogno di alcuni test, ma un buon inizio
Bachalo

mi mostra input: No such file or directory In realtà voglio solo fare video dal testo. proprio come la marca lavora sul browser
manish1706

1
@ manish1706 Come dice l'errore, non c'è input file. Se non si dispone di video a cui si desidera aggiungere del testo, è necessario generare uno sfondo nero. Vedi l'esempio appena aggiunto sopra.
slhck

1
Grazie mille @slhck per l'aiuto, e ho avuto successo per il testo con questo comando ** ffmpeg -f lavfi -i "color=color=yellow, drawtext=enable='gte(t,0)':text=Text1 Text2 Text3 Text4 Text5 Text6 Text7 Text8 Text9 Text10:expansion=normal:fontfile=verdana.ttf: y=h-line_h-120:x=-100*t: fontcolor=white: fontsize=50" -t 20 Output.mp4 ** e il video funziona bene. ora ho solo bisogno di capire come posso passare il carattere html come separatore tra due stringhe, ad esempio: testo 1 (punto segno) testo2 (punto segno) testo3
manish1706

2
@ manish1706 Metti il ​​tuo testo tra virgolette e dovresti essere in grado di aggiungere qualsiasi carattere tu voglia. Se hai molto testo, puoi anche leggerlo da un file usando il textfile opzione al posto di text. Vedere ffmpeg.org/ffmpeg-all.html#drawtext-1
slhck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.