Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Как только процесс будет завершен, вы можете проверить out.txt.

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

Ответ 2

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

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

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

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

Ответ 3

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

С уважением.

Ответ 4

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

 -loglevel debug

или

 -loglevel verbose

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

Ответ 5

ffmpeg logs to 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"

Это будет trancode 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), но не обновления состояния, поэтому лучший вариант, вероятно, для фильтрации этого потока.

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

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

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

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

Ответ 6

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

Ответ 7

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

Проблема заключается в том, что все документы, которые вы можете найти, не работают. Я дал 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".......;

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

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