使用 Gstreamer 捕获屏幕并将其显示在 window 中?

Using Gstreamer to capture screen and show it in a window?

我需要捕获第二个显示器的屏幕并 "monitor" 它在主显示器中,在 window 内(按 x0.5 缩放并使用相邻插值,因为我更喜欢性能而不是质量).从这个 link,我得到了这个截屏命令:

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

...但它捕获到一个文件(不是 window),它缺少比例和插值类型,声音不是必需的,等等。

由于我熟悉 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.

中寻找替代方案

这是 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 = 从 "pixel column" 1280 开始记录 - 也就是说,如果您有两个 1280 宽度的显示器,它将从右侧的那个开始。

参数 use-damage 设置为 0 = 不使用 XDamage。损坏仅计算后续帧之间的差异,这显然要求 CPU。

元素 ximagesink = X 服务器创建 window 作为输出 - 它比 glimagesink(opengl 加速 window)要求更少 CPU。

element videoscale parameter method to 0 meaning nearest neighbor 正如 Mario Mey 在评论中所建议的那样。这使我 CPU 节省了 17% 到 12%。

还有可配置的fps和height/width显示window(我觉得够清楚了)。