web-dev-qa-db-fra.com

Comment activer la journalisation FFMPEG et où puis-je trouver le fichier journal FFMPEG?

Je souhaite pouvoir enregistrer les processus FFMPEG, car j'essaie de calculer le temps de conversion d'une minute de vidéo afin de faciliter la planification de la capacité de mon serveur de codage vidéo. Comment puis-je activer la journalisation et où le fichier journal est-il enregistré? FFMPEG est installé sur une machine CentOS LAMP.

26
undefined

FFmpeg n'écrit pas dans un fichier journal spécifique, mais envoie plutôt sa sortie à erreur standard . Pour capturer cela, vous devez soit

  • capturer et analyser comme il est généré
  • redirige l'erreur standard vers un fichier et lit ensuite le processus 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 le processus terminé, 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. Alors ayez les autres. Jetez un coup d'œil autour de SO et sur le net pour plus de détails.)

25
Stu Thompson

J'ai trouvé les éléments ci-dessous dans ffmpeg Docs. J'espère que cela t'aides! :)

Référence: http://ffmpeg.org/ffmpeg.html#toc-Generic-options

‘-Report’ Sauvegarde la sortie complète de la ligne de commande et de la console dans un fichier nommé programme-AAAAMMJJ-HHMMSS.log dans le répertoire en cours. Ce fichier peut être utile pour les rapports de bugs. Cela implique également -loglevel verbose.

Remarque: la définition de la variable d'environnement FFREPORT sur n'importe quelle valeur a la valeur même effet.

16
MythBuster

Je trouve la réponse . 1/Tout d’abord 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 souhaitez qu'un rapport inclue les commandes -vstats_file MFRfile.txt dans les paramètres prédéfinis, comme dans l'exemple. cela peut faire un rapport indiquant que c'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" en lisant un .docx complet sur les propriétés de MPEG . Enfin, je peux faire ma barre de progression en lisant ce fichier txt généré.

Cordialement.

6
Geovanny1974

semble que si vous ajoutez ceci à la ligne de commande:

 -loglevel debug

ou

 -loglevel verbose

Vous obtenez une sortie de débogage plus détaillée sur la ligne de commande.

3
rogerdpack

ffmpeg se connecte à stderr et peut se connecter à un fichier dont le niveau de journalisation est différent de stderr. L'option de ligne de commande -report ne vous permet pas de contrôler le nom du fichier journal ou son niveau. Par conséquent, il est 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. Exécutez ffmpeg -h full | less pour voir TOUT. Ou consultez le documentation en ligne , ou leurs pages wiki comme le guide de codage h.264 ).

#!/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"

Cela transcrode src.mp4 avec x264 et définira le niveau de journalisation de stderr sur "verbose", et le niveau de journalisation de out.mkv.log sur "statut".

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40, etc.). Le support pour ceci était ajouté il y a 2 ans , vous avez donc besoin d'une version non ancienne de ffmpeg. (Toujours une bonne idée quand même, pour la sécurité/corrections de bugs et accélérations)


Quelques codecs, comme -c:v libx265, écrivent directement dans stderr au lieu d'utiliser l'infrastructure de journalisation de ffmpeg. Ainsi, leurs messages de journal ne se retrouvent pas dans le fichier de rapport. Je suppose que ceci est un élément bug/TODO-list.

Pour enregistrer stderr, tout en le voyant dans un terminal, vous pouvez utiliser tee(1) .


Si vous utilisez un niveau de journal qui inclut les mises à jour de la ligne d'état (le -v info par défaut, ou une version supérieure), elles seront incluses dans le fichier journal, séparées par ^M (retour à la ligne ou \r). Il n'y a pas de niveau de journal qui inclut les statistiques de l'encodeur (comme SSIM) mais pas les mises à jour de la ligne d'état. La meilleure option est probablement de filtrer ce flux.

Si vous ne souhaitez pas filtrer (par exemple, le fichier contient le fps/bitrate à chaque intervalle de mise à jour de l'état), vous pouvez utiliser less -r pour le transmettre directement à votre terminal afin que vous puissiez visualiser les fichiers proprement. Si vous souhaitez parcourir les journaux .enc de plusieurs codes, less -r ++G *.enc fonctionne parfaitement. (++ G signifie commencer à la fin du fichier, pour tous les fichiers). Avec raccourcis clavier comme . et , pour le fichier suivant et le fichier précédent, vous pouvez très bien parcourir certains fichiers journaux. (les liaisons par défaut sont :n et :p).

Si vous souhaitez filtrer, sed 's/.*\r//' fonctionne parfaitement pour la sortie de ffmpeg. (Dans le cas général, vous avez besoin de quelque chose comme vt100.py , mais pas uniquement pour les retours chariot). Il y a (au moins) deux façons de procéder avec tee + sed: tee à/dev/tty et la sortie du tuyau en sed, ou utilisez un processus de substitution pour insérer un tuyau dans un tuyau.

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

Pour tester quelques paramètres de codage différents, vous pouvez créer une fonction similaire à celle que j'ai récemment utilisée pour tester certaines choses. J'avais tout sur une seule ligne pour pouvoir l'éditer facilement, mais je vais le désembrouiller 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
  [email protected].${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 générer des déchets supplémentaires dans le fichier journal, s'il existe déjà. Malgré cela, j'ai utilisé et ajouté (>>) redirect.

Il serait "plus propre" d'écrire une fonction Shell prenant des arguments au lieu de regarder les variables Shell, mais cela é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
Peter Cordes

Vous devez déclarer le fichier de rapport en tant que variable pour la console. 

Le problème, c’est que toutes les documentations que vous pouvez trouver ne fonctionnent pas, alors ... j’ai donné 1 jour de ma vie pour trouver le bon chemin ....

Exemple: pour batch/console 

cmd.exe/K set FFREPORT = fichier = 'C:\ffmpeg\proto\test.log': niveau = 32 && C:\ffmpeg\bin\ffmpeg.exe

Exemple Javascript: 

var reortlogfile = "cmd.exe/K ensemble FFREPORT = fichier = 'C:\ffmpeg\proto \" + nom de fichier + ".log": niveau = 32 && C:\ffmpeg\bin\ffmpeg.exe ".... ...;

Vous pouvez modifier le répertoire et le nom de fichier comme bon vous semble. 

Frank de Berlin

1
frank

Si vous voulez simplement savoir combien de temps cela prend pour que la commande soit exécutée, vous pouvez envisager d’utiliser la commande time . Vous utilisez par exemple time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

0
Valentin Rocher