Использование 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 и высота / ширина окна дисплея (я думаю, что это достаточно ясно).