Использование Gstreamer для захвата экрана и отображения его в окне?

Мне нужно захватить экран второго дисплея и "контролировать" его на главном дисплее, внутри окна (масштабируется в x0,5 и с интерполяцией соседей, потому что я предпочитаю производительность по качеству). По этой ссылке я получил команду screencast:

gst-launch ximagesrc ! ffmpegcolorspace ! queue \
! vp8enc quality=10 speed=2 ! mux. alsasrc ! audio/x-raw-int ! queue \
! audioconvert ! vorbisenc ! mux. webmmux name=mux \
! filesink location=screencast.webm

... но он записывается в файл (не в окно), в нем отсутствуют масштаб и тип интерполяции, звуки не нужны и т. д.

Поскольку я знаком с libav, то, что я ищу, выглядит примерно так:

avconv -f x11grab -r 30 -s 1280x1024 -i :0.1 -c:v mpeg4 -b:v 1000k \
-vf "hflip" -vf "scale=640:480" -sws_flags "neighbor" -f avi - | avplay -i -

... Я бы использовал его, но у него есть некоторые проблемы с частотой кадров (спрашивается здесь). Итак, я ищу альтернативу в Gstreamer.

1 ответ

Решение

Вот команда gst-launch:

gst-launch-1.0 ximagesrc startx=1280 use-damage=0 ! video/x-raw,framerate=30/1 ! videoscale method=0 ! video/x-raw,width=640,height=480  ! ximagesink

Объяснение:

параметр startx = начать запись с "пиксельного столбца" 1280 - то есть, если у вас два монитора шириной 1280, он начнёт с того, что справа.

параметр use-damage установить в 0 = не использовать XDamage. Урон учитывает только различия между последующими кадрами, что, очевидно, требует много ресурсов процессора.

элемент ximagesink = X-сервер создал окно в качестве вывода - его загрузка ЦП меньше, чем glimagesink (ускоренное окно opengl).

элемент videoscale параметр method 0 означает ближайшего соседа, как это было предложено Марио Мей в комментарии. Это привело к экономии CPU с 17% до 12%.

Есть также настраиваемый fps и высота / ширина окна дисплея (я думаю, что это достаточно ясно).

Другие вопросы по тегам