2010-01-14 2 views
24

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

ответ

23

FFmpeg не записывается в конкретный файл журнала, а отправляет свой результат на standard error. Для того, чтобы захватить то, что вам нужно либо

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

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

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

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

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

+0

Хотя ffmpeg не может предоставить возможность записывать файлы журналов, в зависимости от вашего кодека и параметров кодер будет создавать журналы. И это может быть очень разрушительным, поскольку оно написано там, где оно было выполнено, что может привести к разрешению проблем. В моем случае это была проблема с ** PHP ** и использованием '-pass 1/2'. – cregox

+1

@Stu Thompson, проблема в том, что ffmpeg не выводит нормальный вывод отладки в stderr, когда ffmpeg не запускается с консоли, а выполняется программно (он проверяет, является ли это TTY). – Tom

+0

@Tom: У меня нет этой проблемы, мой код Java вызывает FFmpeg программно без проблем. И я не единственный. –

0

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

6

Я нахожу ответ. 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-файл.

С уважением.

+0

+1 индикатор выполнения –

15

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

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

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

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

+2

появляется в эти дни. FFREPORT также может указать имя выходного файла, см. Http://stackoverflow.com/questions/11241878/ffmpeg-report-generation/14417386#14417386 также NB, что указание «-report» автоматически устанавливает регистрацию к вербальному режиму, я считаю. – rogerdpack

+0

Можете ли вы использовать -report и изменить лог-уровень для отладки? – MarcusJ

+0

@MarcusJ: Да, используйте 'из = out.mkv; FFREPORT = "level = 32: file = $ of.log" ffmpeg -v verbose ... "$ из' ', чтобы установить уровень журнала для stderr в" verbose "и уровень журнала для' out.mkv.log' на «статус». ('AV_LOG_WARNING = 24',' AV_LOG_INFO = 32', 'AV_LOG_VERBOSE = 40'). Поддержка этого была добавлена ​​2 года назад (https: //trac.ffmpeg.org/ticket/3057 # comment: 5), поэтому вам нужна не-древняя версия ffmpeg. –

3

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

-loglevel debug 

или

-loglevel verbose 

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

0

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

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

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

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

2

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

(-v является синонимом -loglevel. Run ffmpeg -v help, чтобы увидеть уровни. Run ffmpeg -h full | less, чтобы увидеть все. Или обратитесь к online docs или их вики-страниц, как the h.264 encode guide).

#!/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 в «многословной», и уровень журнала для out.mkv.log в «статус».

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


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

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


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

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

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

Смежные вопросы