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.

26
demandé sur Stu Thompson 2010-01-14 20:21:53

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.)

24
répondu Stu Thompson 2010-01-15 15:20:26

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.

15
répondu MythBuster 2012-03-18 18:06:28

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.

6
répondu Geovanny1974 2012-04-26 18:00:34

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.

3
répondu rogerdpack 2012-07-27 18:09:25

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" )

2
répondu Peter Cordes 2017-04-13 12:36:27

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

1
répondu frank 2015-08-29 16:56:33

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

0
répondu Valentin Rocher 2017-03-29 17:57:21