Как включить ведение журнала FFMPEG и где найти файл журнала FFMPEG?

StackOverflow https://stackoverflow.com/questions/2066076

Вопрос

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

Это было полезно?

Решение

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

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

Пример перенаправления стандартной ошибки:

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

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

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

Другие советы

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

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

'-Report' Limble Fulal Command Line и вывод консоли в файл с именем Program-YyyyMmdd-hmmmss.log в текущем каталоге.Этот файл может быть полезен для отчетов об ошибках.Это также подразумевает -loglevel подробный.

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

Я нахожу ответ.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.вы можете указать любое имя, если хотите, я решил свою проблему «я много раз пишу на этом форуме», прочитав полный .docx о свойствах mpeg.наконец-то я могу сделать свой индикатор выполнения, читая этот сгенерированный текстовый файл.

С уважением.

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

 -loglevel debug

или

 -loglevel verbose

Вы получаете более подробный отладочный вывод в командной строке.

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 на «подробный», а уровень журнала для out.mkv.log к «статусу».

(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 (возврат каретки, он же \r).Не существует уровня журнала, который бы включал статистику кодировщика (например, SSIM), но не обновления строки состояния, поэтому лучшим вариантом, вероятно, будет фильтрация этого потока.

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

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

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

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 день своей жизни, чтобы найти правильный путь....

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

cmd.exe /K set FFREPORT=file='C:\ffmpeg\proto est.log':level=32 && C:\ffmpeg\bin\ffmpeg.exe -loglevel alert -report -i inputfile f выходной файл

Пример Javascript:

var reortlogfile = "cmd.exe /K set FFREPORT=file='C:\ffmpeg\proto\" + имя файла + ".log':level=32 && C:\ffmpeg\bin\ffmpeg.exe" .... ...;

Вы можете изменить каталог и имя файла по своему усмотрению.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top