Comment activer la journalisation FFMPEG et Où puis-je trouver le fichier de journalisation FFMPEG?
je veux être capable de logger les processus FFMPEG parce que j'essaie de déterminer combien de temps une minute de vidéo prend à convertir pour aider à la planification de la capacité de mon serveur d'encodage vidéo. Comment puis-je activer la journalisation et où est le fichier journal enregistré. J'ai installé FFMPEG sur une lampe CentOS.
7 réponses
FFmpeg n'écrit pas dans un fichier log spécifique, mais envoie plutôt sa sortie à erreur standard . Pour capturer cela, vous devez soit
- la capture et de l'analyser comme il est généré
- rediriger l'erreur standard vers un fichier et lire qu'après le processus est terminé
exemple de redirection d'erreur std:
ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
une fois que le processus est fait, vous pouvez inspecter out.txt
.
c'est un peu plus compliqué de faire la première option, mais c'est possible. (Je l'ai fait moi-même. Donc, avoir d'autres. Consultez SO and the net pour plus de détails.)
j'ai trouvé les trucs ci-dessous dans ffmpeg Docs. Espérons que cette aide! :)
référence: http://ffmpeg.org/ffmpeg.html#toc-Generic-options
‘-rapport’ Dump complet de la ligne de commande et de sortie de la console dans un fichier nommé programme-AAAAMMJJ-HHMMSS.journal dans le répertoire courant. Ce fichier peut être utile pour les rapports de bug. Il implique également-LogLevel verbose.
Note: réglage de l'environnement la variable "rapport à n'importe quelle valeur" même effet.
je trouve la réponse. 1 / D'abord mis dans les presets, j'ai cet exemple "format de sortie 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
si vous voulez un rapport inclut les commandes-vstats_file MFRfile.txt dans les presets comme dans l'exemple. cela peut faire un rapport qui est ubicadet dans le dossier source de votre fichier Source. vous pouvez mettre n'importe quel nom si vous voulez , j'ai résolu mon problème "j'écris plusieurs fois dans ce forum" la lecture d'un complet .docx sur les propriétés mpeg. enfin je peux faire mon barre de progression lisant ce fichier txt généré.
Cordialement.
apparaît que si vous ajoutez ceci à la ligne de commande:
-loglevel debug
ou
-loglevel verbose
vous obtenez plus de sortie de débogage verbeux vers la ligne de commande.
ffmpeg journaux à la sortie stderr, et peut se connecter à un fichier avec un autre log au niveau de la sortie stderr. L'option -report
de la ligne de commande ne vous donne pas le contrôle du nom du fichier log ou du niveau de log, il est donc préférable de définir la variable d'environnement.
( -v
est un synonyme de -loglevel
. Exécutez ffmpeg -v help
pour voir les niveaux. Lancez ffmpeg -h full | less
pour tout voir. Ou consultez les Docs en ligne , ou leurs pages wiki comme the H. 264 code guide ).
#!/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"
qui convertira src.mp4
en x264, et définira le niveau log pour stderr à" verbose", et le niveau log pour out.mkv.log
en"status".
( AV_LOG_WARNING=24
, AV_LOG_INFO=32
, AV_LOG_VERBOSE=40
, etc.). Le Support pour cela a été ajouté il y a 2 ans , donc vous avez besoin d'une version non-antique de ffmpeg. (Toujours une bonne idée de toute façon, pour la sécurité / bugfixes et speedups)
quelques codecs, comme -c:v libx265
, écrivent directement à stderr au lieu d'utiliser l'infrastructure de journalisation de ffmpeg. pour que leurs messages ne finissent pas dans le rapport. Je suppose que c'est un bug / TODO-list item.
pour enregistrer stderr, tout en le voyant dans un terminal, vous pouvez utiliser tee(1)
.
si vous utilisez un niveau log qui inclut les mises à jour de ligne de statut (le défaut -v info
, ou plus), ils seront inclus dans le fichier log, séparé par ^M
(retour chariot alias \r
). Il n'y a pas de niveau log qui inclut les statistiques codeur (comme SSIM) mais pas les mises à jour de ligne de statut, donc la meilleure option est probablement de filtrer ce flux.
si vous ne voulez pas filtrer (par exemple le fps / bitrate à chaque statut-intervalle de mise à jour est là dans le fichier), vous pouvez utiliser less -r
pour passer directement à votre terminal, vous pouvez visualiser les fichiers proprement. Si vous avez .enc
logs de plusieurs encodages que vous voulez feuilleter, less -r ++G *.enc
fonctionne très bien. (G++signifie commencer à la fin du fichier pour tous les fichiers). Avec fixations à clé unique comme .
et ,
pour le fichier suivant et le fichier précédent, vous pouvez feuilleter certains fichiers journaux très bien. (les fixations par défaut sont :n
et :p
).
si vous voulez filtrer, sed 's/.*\r//'
fonctionne parfaitement pour la sortie ffmpeg. (Dans le cas général, vous avez besoin de quelque chose comme vt100.py
, mais pas seulement pour les retours de chariot). Il y a (au moins) deux façons de le faire avec tee + sed: tee
/dev/tty et le tuyau té de sortie en sed, ou d'utiliser un processus de substitution à tee dans une pipe à 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="-x265.mkv"
ffmpeg -v info -i "" -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 "" -c:a copy -c:v libx265 ... "$of" |&
tee >(sed 's/.*\r//' >> "$of.enc")
pour tester quelques paramètres d'encodage différents, vous pouvez faire une fonction comme celle-ci que j'ai utilisée récemment pour tester certaines choses. J'avais tout ça sur une ligne pour pouvoir facilement le remonter et le modifier, mais je vais le désamorcer ici. (C'est pourquoi il y a ;
s à la fin de chaque ligne)
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
notez qu'il teste l'existence du fichier vidéo de sortie pour éviter de rejeter des déchets supplémentaires dans le fichier log si elle il existe déjà. Malgré cela, j'ai utilisé et ajouté ( >>
) rediriger.
il serait" plus propre " d'écrire une fonction shell qui prend args au lieu de regarder les variables shell, mais c'était pratique et facile à écrire pour mon propre usage. C'est aussi pourquoi j'ai économisé de l'espace en ne citant pas correctement toutes mes extensions variables. ( $v
au lieu de "$v"
)
vous devez déclarer la variable reportfile comme variable pour console.
le problème est que toutes les Dokumentations que vous pouvez trouver ne fonctionnent pas ainsi .. Je donnais 1 jour de ma vie pour trouver le bon chemin ....
exemple: pour lot/console
cmd.exe / K set FFREPORT=file='C:\ffmpeg\proto\test.log': niveau = 32 && C:\ffmpeg\bin\ffmpeg.avertissement de niveau exe-log-report-I inputfile f outputfile
Exemple Javascript:
var reortlogfile = " cmd.exe / K set FFREPORT=file='C:\ffmpeg\proto\" + filename +".log': niveau = 32 && C:\ffmpeg\bin\ffmpeg.EXE. "......;
vous pouvez changer le dir et le nom de fichier comme vous voulez.
Frank de Berlin
si vous voulez juste savoir combien de temps il faut pour exécuter la commande, vous pouvez envisager d'utiliser la commande time . Vous utilisez par exemple time ffmpeg -i myvideoofoneminute.aformat out.anotherformat