2015-11-17 3 views
2

Мне нужно захватить экран второго дисплея и «контролировать» его на главном дисплее внутри окна (масштабируется по x0.5 и с интерполяцией соседа, потому что я предпочитаю производительность против качества). Из этого link, я получил эту команду скринкаста:Использование Gstreamer для захвата экрана и отображения его в окне?

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 - 

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

+0

предоставьте [mcve] (http://stackoverflow.com/help/mcve), если у вас есть что-то и не работает, мы можем продолжить с ответами. Но я дам вам [подсказку] (https://www.google.com/search?q=linux+gstreamer+screen+capture), удачи – nayana

+0

@otopolsky: Я отредактировал вопрос, пытаясь предоставить mcve. Я уже искал для вас намек, и именно так я нашел команду gst-launch, которую я только что добавил. –

ответ

3

Вот команда GST-запуска:

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

+1

Это то, что мне нужно, спасибо! Мне пришлось использовать ximagesink вместо glimagesink (это говорит ПРЕДУПРЕЖДЕНИЕ: ошибочный конвейер: никакого элемента «glimagesink»). И я добавил «method = 0», чтобы использовать интерполяцию ближайшего соседа для видеосъемки, чтобы сделать ее еще дешевле (из [здесь] (https://groups.google.com/d/msg/gstreamer-java/1WiZrIy9ziM/8P293 -sLR4EJ)) –

+0

спасибо @MarioMey Я обновил ответ. поэтому вам не хватает glimagesink. Но достаточно смешно - я сделал несколько тестов, и их намного быстрее с ximagesink, чем glimagesink - я буду дополнительно редактировать свой ответ. – nayana

+0

код все еще говорит «glimagesink»! –

Смежные вопросы