Domanda

Voglio essere in grado di accedere processi FFMPEG perché sto cercando di capire quanto tempo un minuto di video necessario per convertire per aiutare con la pianificazione della capacità del mio server codifica video. Come faccio ad attivare la registrazione e dove è il file di registro salvato. Ho FFMPEG installato su una macchina CentOS LAMP.

È stato utile?

Soluzione

FFmpeg non scrive in un file di log specifico, ma piuttosto invia il proprio output a errore standard. Per catturare questo, è necessario o

  • cattura e analizzare come si è generato
  • reindirizzare errore standard a un file e leggere che dopo il processo è finito

Esempio per il reindirizzamento errore std:

ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt

Una volta che il processo è fatto, è possibile controllare out.txt.

E 'un po' più complicato di fare la prima opzione, ma è possibile. (Ho fatto io. Quindi sono gli altri. Dai un'occhiata in giro così e la rete per i dettagli.)

Altri suggerimenti

Ho trovato la roba di seguito in Documenti ffmpeg. Spero che sia di aiuto! :)

Riferimento: http://ffmpeg.org/ffmpeg.html#toc-Generic- opzioni

  

‘- rapporto’ Dump riga di comando piena e l'output della console in un file denominato   programma-AAAAMMGG-HHMMSS.log nella directory corrente. Questo file può essere   utile per segnalazioni di bug. Implica anche verbose -loglevel.

     

Nota: impostazione dell'ambiente FFREPORT variabile qualsiasi valore ha la   stesso effetto.

trovo la risposta. 1 / In primo luogo mettere in preset, ho questo esempio "Formato di uscita MPEG2 DVD HQ"

-vcodec mpeg2video -vstats_file MFRfile.txt -r 29.97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2

Se si desidera un rapporto include i comandi -vstats_file MFRfile.txt nelle impostazioni predefinite, come l'esempio. questo può fare una relazione che è ubicadet nella fonte cartella di vostra origine del file. si può mettere tutto il nome, se si desidera, ho risolto il mio problema "Scrivo molte volte in questo forum" la lettura di un .docx completa sulle proprietà mpeg. Finalmente posso fare la mia barra di progresso la lettura di questo file txt generato.

Saluti.

Sembra che se si aggiunge questo alla riga di comando:

 -loglevel debug

o

 -loglevel verbose

È possibile ottenere output di debug più dettagliato alla riga di comando.

log ffmpeg per stderr, e possono accedere ad un file con un diverso log-level da stderr. L'opzione -report della riga di comando non ti dà il controllo del nome del file di registro o il livello di log, quindi impostando la variabile ambientale è preferibile.

(-v è sinonimo di -loglevel. Eseguire ffmpeg -v help per vedere i livelli. Eseguire ffmpeg -h full | less per vedere tutto. O consultare il Documenti Online , o le loro pagine wiki come della guida h.264 codifica ).

#!/bin/bash

of=out.mkv
FFREPORT="level=32:file=$of.log" ffmpeg -v verbose   -i src.mp4 -c:a copy -preset slower -c:v libx264 -crf 21 "$of"

Che vi TRANCODE src.mp4 con x264, e impostare il livello di log per stderr a "verbose", e il livello di log per out.mkv.log di "status".

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40, etc.). Il supporto per questo è stato 2 anni fa , quindi è necessario un non-antica versione di ffmpeg. (Sempre comunque una buona idea, per la sicurezza / Correzione degli errori e incrementi nella velocità)


Alcuni codec, come -c:v libx265, scrivere direttamente a stderr invece di utilizzare l'infrastruttura di registrazione di FFmpeg. Quindi i loro messaggi di log non finiscono nel file di report. Suppongo che questo è un elemento di bug / TODO-list.

Per accedere stderr, mentre ancora vederlo in un terminale, è possibile utilizzare tee(1) .


Se si utilizza un livello di log che include aggiornamenti riga di stato (l'impostazione predefinita, -v info o superiore), che saranno inclusi nel file di registro, separato con ^M (ritorno a capo aka \r). Non c'è livello di log che include le statistiche encoder (come SSIM) ma non gli aggiornamenti di stato di riga, quindi l'opzione migliore è probabilmente quello di filtrare tale flusso.

Se non si desidera filtrare (ad esempio, in modo che il fps / bitrate a ogni intervallo di status-aggiornamento è lì nel file), è possibile utilizzare less -r passare loro attraverso direttamente al terminale in modo da poter visualizzare i file in modo pulito. Se avete .enc registri da vari codifica che si desidera sfogliare, less -r ++G *.enc grandi opere. (++ G significa iniziare alla fine del file, per tutti i file). Con single-chiave combinazioni di tasti come . e , per il prossimo di file e file precedente, è possibile sfogliare alcuni file di log molto bene. (Le associazioni predefinite sono :n e :p).

Se si vuole filtrare, sed 's/.*\r//' funziona perfettamente per l'uscita ffmpeg. (Nel caso generale, avete bisogno di qualcosa come vt100.py , ma non solo per ritorni a capo). Ci sono (almeno) due modi per fare questo con il T + sed:. tee a / dev / tty ed uscita del tubo T in sed, o utilizzare un cambio processo di tee in un tubo di sed

# pass stdout and stderr through to the terminal, 
## and log a filtered version to a file (with only the last status-line update).

of="$1-x265.mkv"
ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |&    # pipe stdout and stderr
   tee /dev/tty | sed 's/.*\r//' >> "$of.enc"

## or with process substitution where tee's arg will be something like /dev/fd/123

ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |&
  tee >(sed 's/.*\r//' >> "$of.enc")

Per testare alcuni parametri di codifica diversi, è possibile effettuare una funzione di come questo che ho usato di recente per testare alcune cose. Ho avuto tutto su una riga in modo ho potuto facilmente freccia in alto e modificarlo, ma io non-offuscare qui. (Ecco perché ci sono ;s alla fine di ogni riga)

ffenc-testclip(){
  # v should be set by the caller, to a vertical resolution.  We scale to WxH, where W is a multiple of 8 (-vf scale=-8:$v)
  db=0;   # convenient to use shell vars to encode settings that you want to include in the filename and the ffmpeg cmdline
  of=25s@21.15.${v}p.x265$pre.mkv; 
  [[ -e "$of.enc" ]]&&echo "$of.enc exists"&&return;   # early-out if the file exists

  # encode 25 seconds starting at 21m15s (or the keyframe before that)
  nice -14 ffmpeg -ss $((21*60+15))  -i src.mp4 -t 25  -map 0 -metadata title= -color_primaries bt709 -color_trc bt709 -colorspace bt709 -sws_flags lanczos+print_info -c:a copy -c:v libx265 -b:v 1500k -vf scale=-8:$v  -preset $pre -ssim 1 -x265-params ssim=1:cu-stats=1:deblock=$db:aq-mode=1:lookahead-slices=0 "$of" |&
   tee /dev/tty | sed 's/.*\r//' >> "$of.enc";
}

# and use it with nested loops like this.
for pre in fast slow;  do for v in  360 480 648 792;do  ffenc-testclip ;done;done

less -r ++G *.enc       # -r is useful if you didn't use sed

Si noti che mette alla prova per l'esistenza del file video di uscita per evitare vomitando spazzatura in più nel file di registro se esiste già. Anche così, ho usato e aggiungere (>>) reindirizzamento.

Sarebbe più "pulito" per scrivere una funzione shell che ha preso args invece di guardare variabili di shell, ma questo era un comodad facile scrivere per il mio uso. È anche per questo ho salvato spazio non citando correttamente tutte le mie espansioni variabili. ($v invece di "$v")

È necessario dichiarare la ReportFile come variabile per console.

Il problema è che tutto il Dokumentations si possono trovare non sono in esecuzione così .. Ero dare uno giorno della mia vita per trovare la strada giusta ....

Esempio: per il lotto / console

cmd.exe / K set FFREPORT = file = 'C: \ ffmpeg \ proto \ test.log': livello = 32 && C: \ ffmpeg \ bin \ ffmpeg.exe -loglevel avvertimento -report -i inputfile f outputfile

Esempio JavaScript:

var reortlogfile = "cmd.exe / K set FFREPORT = file = 'C: \ ffmpeg \ proto \" + filename +" log': livello = 32 && C: \ ffmpeg \ bin \ ffmpeg.exe". ......;

È possibile modificare il nome del file dir e come mai si desidera.

Frank da Berlino

Se si vuole solo sapere quanto tempo ci vuole per il comando da eseguire, potete prendere in considerazione l' tempo comando. È ad esempio l'uso time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top