FFmpeg drawtext su più righe

Ho il codice:

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 )

per scrivere il testo in un file video. Ma voglio scrivere molte righe di testo invece di avere tutto su una riga.

Pls aiuto. Grazie

InformationsquelleAutor Jared | 2011-11-21

 

4 Replies
  1. 16

    Questa risposta è probabilmente un po ‘ tardi per voi, ma è possibile specificare più drawtexts su un file utilizzando l’ [in] tag e l’elenco di ogni drawtext con la virgola. Questo consente di utilizzare più righe se si orienta ogni drawtext, attraverso i loro rispettivi metodi di posizionamento. Nel tuo esempio, la riga di comando dovrebbe essere simile a questo (mette la prima riga in mezzo allo schermo, e mette ogni riga successiva 25 pixel in basso):

    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
    
  2. 14

    Guardando il codice sorgente in ffmpeg (vs_drawtext.c):

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

    così si può provare a inserire \f o \v nella vostra linea di testo che corrispondono a ^L o ^K caratteri. Per esempio:

    -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:[email protected]:text='two^Llines'[out]"
    

    ^L essere l’effettivo Ctrl-L carattere e non ^ e L ovviamente.

    • +1 per il riferimento al codice sorgente. Benvenuti a Stack Overflow!
    • Non so se questa è la versione specifica o meno, ma c’è a mia conoscenza nessun modo per controllare la spaziatura tra le righe con questa soluzione e ho finito per usare @Ben ‘s uno mentre controlla la spaziatura con il h:{int} comando. In caso contrario, le linee finirebbe per essere disegnato sulla parte superiore di ogni altro, o almeno così vicino che non era leggibile.
    • Inserire ^L nella maggior parte dei terminali, si può fare Ctrl-V prima quindi premere Ctrl-L.
    • Qui è la fonte, se qualcuno vuole dare un’occhiata a: github.com/FFmpeg/FFmpeg/blob/…
  3. 5

    Sono riuscito a ottenere questo lavoro da riga di comando specificando il ‘file’ e un parametro di mettere il mio testo in questo file.

    Vedere http://ffmpeg.org/libavfilter.html#drawtext per aiutare di più. Usando ffmpeg costruire N-35057-g2c44aed su windows, ma la cosa importante è che si dispone di versione recente di libavfilter.

    • Sì, ho già un lavoro, ma non mi piace il fatto che il mio script è in costante e l’eliminazione di file. BTW è anche possibile chiamare il drawtext bandiera più di una volta e solo offset il testo sull’asse Y per creare una nuova riga. Ho testato e ottenuto che lavora troppo ma la mia domanda membri, vorrei aggiungere tante righe con un drawtext bandiera e senza dover creare un file esterno. Grazie per aver dedicato del tempo per rispondere tho. Molto apprezzato 🙂
  4. 3

    Ho semplicemente aggiunto nuove linee di comando ffmpeg e gestito correttamente.

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

    N Ctrl+L Ctrl+K hack sono necessari!

    I. e. Ho appena premuto Invio dopo “ciao”.

    Si può fare la modifica di un file di script o anche nella riga di comando bash.

    • Ma purtroppo non è facile in Windows CMD credo…

Lascia un commento