Как включить ведение журнала FFMPEG и где я могу найти файл журнала FFMPEG?
Я хочу иметь возможность регистрировать процессы FFMPEG, потому что я пытаюсь выяснить, сколько времени занимает минута видео для преобразования, чтобы помочь с планированием емкости моего сервера кодирования видео. Как включить ведение журнала и где сохранен файл журнала. У меня есть FFMPEG, установленный на Ламповой машине CentOS.
7 ответов
FFmpeg не записывает в определенный файл журнала, а отправляет его вывод в Стандартная ошибка. Чтобы захватить это, вам нужно либо
- захват и разбор его, как он генерируется
- перенаправить стандартный поток ошибок в файл и прочитать, что после завершения процесса
пример перенаправления ошибок std:
ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
Как только процесс будет сделано, вы можете проверить out.txt
.
Это немного сложнее сделать первый вариант, но это возможно. (Я сделал это сам. Как и другие. Посмотрите вокруг так и сеть для деталей.)
Я нашел ниже материал в документах ffmpeg. Надеюсь, это поможет! :)
ссылка:http://ffmpeg.org/ffmpeg.html#toc-Generic-options
‘-report’ дамп полной командной строки и вывода консоли в файл с именем программа-YYYYMMDD-HHMMSS.войдите в текущий каталог. Этот файл может быть полезно для отчетов об ошибках. Это также означает -уровень многословен.
Примечание: установка переменной среды 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 в пресеты, как пример. это может сделать отчет, который он ubicadet в папке источника вашего источника файла. вы можете поставить любое имя, если хотите, я решил свою проблему "я пишу много раз на этом форуме", читая полный.docx о свойствах mpeg. наконец, я могу сделать свой прогресс-бар чтение этого созданного файла txt.
С уважением.
появляется, что если вы добавите это в командную строку:
-loglevel debug
или
-loglevel verbose
вы получите более подробный вывод отладки в командной строке.
ffmpeg входит в stderr и может войти в файл с другим уровнем журнала от stderr. The -report
опция командной строки не дает вам контроля над именем файла журнала или уровнем журнала, поэтому предпочтительнее установить переменную среды.
(-v
синоним -loglevel
. Запустить ffmpeg -v help
посмотреть уровни. Запустить ffmpeg -h full | less
чтобы увидеть все. Или обратитесь к online docs, или вики-страницы в час.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 в "подробный", а уровень журнала для out.mkv.log
в "статус".
(AV_LOG_WARNING=24
, AV_LOG_INFO=32
, AV_LOG_VERBOSE=40
, etc.). Поддержка для этого была добавлено 2 года назад, поэтому вам нужна не древняя версия ffmpeg. (Всегда хорошая идея в любом случае, для безопасности / исправлений ошибок и ускорений)
несколько кодеков, как -c:v libx265
, пишите прямо stderr вместо использования инфраструктуры ведения журнала ffmpeg. таким образом, их сообщения журнала не попадают в файл отчета. Я предполагаю, что это элемент bug / TODO-list.
для регистрации stderr, все еще видя его в терминале, вы можете использовать tee(1)
.
если вы используете уровень журнала, который включает обновления строки состояния (по умолчанию -v info
, или выше), они будут включены в файл журнала, разделенных ^M
(возврат каретки он же \r
). Нет уровня журнала, который включает статистику кодировщика (например, SSIM), но не обновления строки состояния, поэтому лучшим вариантом, вероятно, является фильтрация этого потока.
если не хотите фильтровать (например, чтобы fps / битрейт в каждом интервале обновления состояния был в файле), вы можете использовать less -r
чтобы передать их непосредственно на ваш терминал, чтобы вы могли просматривать файлы чисто. Если у вас есть .enc
журналы из нескольких кодов, которые вы хотите пролистать,less -r ++G *.enc
работает отлично. (++Г означает начало в конце файла, для всех файлов). С привязки с одним ключом как .
и ,
для следующего файла и предыдущего файла, вы можете пролистать некоторые файлы журнала очень красиво. (привязки по умолчанию::n
и :p
).
если вы хотите фильтровать,sed 's/.*\r//'
отлично работает для вывода ffmpeg. (В общем случае вам нужно что-то как vt100.py
, но не только возврат каретки). Есть (по крайней мере) два способа сделать это с помощью tee + sed:tee
to /dev/tty и выход тройника трубы в 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="-x265.mkv"
ffmpeg -v info -i "" -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 "" -c:a copy -c:v libx265 ... "$of" |&
tee >(sed 's/.*\r//' >> "$of.enc")
для тестирования нескольких различных параметров кодирования вы можете сделать функцию как этот, который я недавно использовал для тестирования некоторых вещей. У меня все это было на одной строке, поэтому я мог легко стрелка вверх и отредактировать его, но я не буду запутывать его здесь. (Вот почему есть ;
в конце каждого line)
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
обратите внимание, что он проверяет наличие выходного видеофайла, чтобы избежать выброса дополнительного мусора в файл журнала, если он уже существует. Тем не менее, я использовал и добавляю (>>
перенаправление).
было бы "чище" написать функцию оболочки, которая принимала args вместо того, чтобы смотреть на переменные оболочки, но это было удобно и легко писать для моего собственного использования. Вот почему я сохранил пространство, неправильно цитируя все мои расширения переменных. ($v
вместо "$v"
)
Если вы просто хотите знать, сколько времени требуется для выполнения команды, вы можете использовать времени. Вы, например, используете time ffmpeg -i myvideoofoneminute.aformat out.anotherformat