Как включить ведение журнала FFMPEG и где я могу найти файл журнала FFMPEG? - PullRequest
27 голосов
/ 14 января 2010

Я хочу иметь возможность регистрировать процессы FFMPEG, потому что я пытаюсь определить, сколько времени занимает конвертация видео, чтобы помочь с планированием емкости моего сервера кодирования видео. Как включить ведение журнала и где сохранить файл журнала. Я установил FFMPEG на машину CentOS LAMP.

Ответы [ 7 ]

26 голосов
/ 15 января 2010

FFmpeg не записывает данные в определенный файл журнала, а отправляет свои выходные данные на стандартная ошибка . Чтобы захватить это, вам нужно либо

  • захватить и разобрать его, как он генерируется
  • перенаправить стандартную ошибку в файл и прочитать, что после этого процесс завершен

Пример перенаправления ошибок std:

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

После завершения процесса вы можете проверить out.txt.

Несколько сложнее сделать первый вариант, но это возможно. (Я сделал это сам. Так что и другие. Посмотрите вокруг SO и сеть для деталей.)

17 голосов
/ 17 марта 2012

Я нашел следующие материалы в ffmpeg Docs. Надеюсь это поможет! :)

Ссылка: http://ffmpeg.org/ffmpeg.html#toc-Generic-options

‘- report 'Дамп полной командной строки и вывод консоли на файл с именем program-YYYYMMDD-HHMMSS.log в текущем каталоге. Этот файл может быть полезно для отчетов об ошибках. Это также подразумевает подробный уровень логики.

Примечание: установка переменной среды FFREPORT на любое значение имеет тот же эффект.

6 голосов
/ 23 января 2010

Я нахожу ответ. 1 / Сначала поместите в пресеты, у меня есть этот пример "Выходной формат 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

Если вы хотите, чтобы отчет включал команды -vstats_file MFRfile.txt в предустановки, как в примере. это может сделать отчет, который он убикадет в папку source вашего файла Source. Вы можете указать любое имя, если хотите, я решил свою проблему «я пишу много раз на этом форуме», прочитав полный .docx о свойствах mpeg наконец, я могу сделать мой индикатор выполнения, читая этот сгенерированный текстовый файл.

С уважением.

3 голосов
/ 27 июля 2012

появляется, если добавить это в командную строку:

 -loglevel debug

или

 -loglevel verbose

В командную строку вы получаете больше подробных результатов отладки.

2 голосов
/ 04 августа 2016

ffmpeg регистрирует в stderr и может записывать в файл с уровнем регистрации, отличным от stderr. Параметр командной строки -report не позволяет управлять именем файла журнала или уровнем журнала, поэтому установка переменной среды предпочтительнее.

(-v является синонимом -loglevel. Запустите ffmpeg -v help, чтобы увидеть уровни. Выполните ffmpeg -h full | less, чтобы увидеть ВСЕ. Или обратитесь к онлайн-документам или к их вики-страницам, таким как руководство по кодированию 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"

Это будет транскодировать src.mp4 с x264 и установить уровень ведения журнала для stderr на «verbose», а уровень ведения журнала на out.mkv.log на «status».

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40 и т. Д.). Поддержка этого была добавлена ​​2 года назад , поэтому вам нужна не древняя версия ffmpeg. (Всегда хорошая идея для безопасности / исправления ошибок и ускорений)


Несколько кодеков, например -c:v libx265, пишут напрямую в stderr вместо использования инфраструктуры ведения журнала ffmpeg. Таким образом, их сообщения журнала не попадают в файл отчета. Я предполагаю, что это элемент списка ошибок / TODO.

Для входа в stderr, пока он еще видится в терминале, вы можете использовать tee(1).


Если вы используете уровень журнала, который включает в себя обновления строки состояния (по умолчанию -v info или выше), они будут включены в файл журнала, разделенные ^M (возврат каретки aka \r). Нет уровня журнала, который бы включал статистику кодировщика (например, SSIM), но не обновлял строки состояния, поэтому, вероятно, лучше всего фильтровать этот поток.

Если вы не хотите фильтровать (например, в файле есть частота кадров / битрейт в каждом интервале обновления состояния), вы можете использовать less -r, чтобы передать их прямо на ваш терминал, чтобы вы могли просматривать файлы чисто. Если у вас есть .enc журналов из нескольких кодов, которые вы хотите пролистать, less -r ++G *.enc отлично работает. (++ G означает начало в конце файла для всех файлов). С привязками одноклавишных клавиш , такими как . и , для следующего файла и предыдущего файла, вы можете очень легко пролистывать некоторые файлы журнала. (привязки по умолчанию :n и :p).

Если вы хотите фильтровать, sed 's/.*\r//' отлично работает для вывода ffmpeg. (В общем случае вам нужно что-то , например vt100.py, но не только для возврата каретки). Есть (по крайней мере) два способа сделать это с помощью tee + sed: tee to / dev / tty и вывести трубу tee в sed, или использовать подстановку процесса, чтобы перейти в трубу к 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")

Для тестирования нескольких различных параметров кодирования вы можете создать функцию , такую ​​как эта, которую я недавно использовал для тестирования некоторых вещей. У меня все это было в одной строке, поэтому я мог легко поднять стрелку вверх и отредактировать ее, но здесь я не буду обфусцировать ее (Вот почему в конце каждой строки ;)

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

Обратите внимание, что он проверяет наличие выходного видеофайла, чтобы избежать выброса лишнего мусора в файл журнала, если он уже существует. Тем не менее, я использовал и добавляю (>>) редирект.

Было бы «чище» написать функцию оболочки, которая бы принимала аргументы вместо просмотра переменных оболочки, но это было удобно и легко написать для моего собственного использования. Вот почему я сэкономил место, неправильно указав в кавычках все мои расширения переменных. ($v вместо "$v")

1 голос
/ 29 августа 2015

Вы должны объявить файл отчета как переменную для консоли.

Проблема в том, что все документирования, которые вы можете найти, не запущены, поэтому .. Мне дали 1 день моей жизни, чтобы найти правильный путь ....

Пример: для партии / консоли

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

Пример Javascript:

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

Вы можете изменить каталог и имя файла, как хотите.

Франк из Берлина

0 голосов
/ 15 января 2010

Если вы просто хотите узнать, сколько времени требуется для выполнения команды, вы можете рассмотреть возможность использования команды time . Вы например используете time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

...