мы можем использовать +(stringOfNumber)
вместо использования parseInt(stringOfNumber)
Ex: +("21")
возвращает int 21, как parseInt("21")
.
мы можем использовать этот унарный " + "для синтаксического анализа float тоже ...
FFmpeg не записывает в конкретный файл журнала, а скорее отправляет свой вывод на стандартная ошибка . Чтобы захватить это, вам нужно либо
Пример перенаправления ошибок std:
ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
После завершения процесса вы можете проверить out.txt
.
Первый вариант немного сложнее, но это возможно. (Я сделал это сам. Так что и другие. Посмотрите вокруг SO и сеть для деталей.)
Если вы просто хотите узнать, сколько времени занимает выполнение команды, вы можете рассмотреть возможность использования команды time . Вы, например, используете time ffmpeg -i myvideoofoneminute.aformat out.anotherformat
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
(каретка) возврат ака \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, или использовать подстановку процесса, чтобы выполнить переход в pipe к 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 / Сначала поставить в пресеты, у меня есть этот пример «Выходной формат 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.
С уважением.