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.
FFmpeg n'écrit pas dans un fichier journal spécifique, mais envoie plutôt sa sortie à erreur standard . Pour capturer cela, vous devez soit
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.)
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.
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.
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.
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"
)
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
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