В итоге я сделал что-то вроде:
ffmpeg -i input-file.mkv -vcodec h264 -s:v 1280x800 -acodec copy output-file.mkv
Примечание: использование -vcodec copy
не работает, так как это обходит декодирование/кодирование полностью и, таким образом, не позволяет применять фильтры. Уменьшение масштаба видео до такой степени привело к значительному уменьшению файлов и решению проблем с производительностью. Я также попробовал еще больше ограничить битрейт с помощью -b
, но это привело к заметному снижению качества и не повлияло на производительность воспроизведения.
Просто используйте:
{ err=$(cmd 2>&1 >&3 3>&-); } 3>&1
Чтобы получить стандартный вывод cmd
, оставив его стандартный вывод нетронутым (здесь, используя fd 3 для введите исходный стандартный вывод (, скопированный с помощью3>&1
)внутри подстановки команды (восстановлен с помощью >&3
после того, как мы перенаправили fd 2 в канал, созданный заменой команды на2>&1
)).
Вы можете использовать ответ, предоставленный Stéphane Chazelas с небольшими изменениями :, только перенаправить stderr и не использовать подстановку команд для запуска вашей команды.
{
command 2> /dev/fd/3
res=$?
err=$(cat<&3)
} 3<<EOF
EOF
printf 'stderr: %s\n' "$err"
Вывод command
обычно будет выводиться в stdout, а stderr — в переменной err
.
Просто замените stdout и stderr на команду для захвата stderr.
pull=$(sudo./pull "${TAG}" 3>&2 2>&1 1>&3)
А затем перенаправить stderr обратно на stdout:
{ pull=$(sudo./pull "${TAG}" 3>&2 2>&1 1>&3; } 2>&1
Пояснение:
Так же, как при захвате только стандартного вывода команды:
var=$(cmd)
вывод stderr по-прежнему поступает в командную строку. Вы можете поменять местами оба канала, чтобы захватить только stderr:
var=$(cmd 3>&2 2>&1 1>&3)
Затем перенаправьте стандартный вывод обратно на стандартный вывод (, чтобы отобразить вывод (, если он есть )).
{ var=$(f 3>&2 2>&1 1>&3); } 2>&1
Объединение ответов из Как вывести на экран переопределяющее перенаправление и Как захватить stderr ключевого слова bash (, например. время )? , я получаю
var=$( (cmd >/dev/tty) 2>&1)
Если вы не используете встроенную функцию или ключевое слово, это упрощается до
var=$( cmd 2>&1 >/dev/tty )