使用Gstreamer捕获屏幕并在窗口中显示它?

Mar*_*Mey 4 gstreamer screencast

我需要捕获第二个显示器的屏幕并在主显示器中"监视"它,在窗口内(按x0.5缩放并使用邻居插值,因为我更喜欢性能与质量).从这个链接,我有这个截屏命令:

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
Run Code Online (Sandbox Code Playgroud)

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

由于我熟悉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 -
Run Code Online (Sandbox Code Playgroud)

...我会用它,但它有一些帧速率问题(在这里问).所以,我正在寻找Gstreamer的替代.

nay*_*ana 7

这是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
Run Code Online (Sandbox Code Playgroud)

说明:

参数startx=从"像素列"1280开始记录 - 即如果您有两个1280宽度监视器,它将从右侧的那个开始.

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

element ximagesink= X服务器创建的窗口作为输出 - 它比glimagesink(opengl加速窗口)更少的CPU要求.

元素videoscale参数method为0表示Mario Mey在评论中建议的最近邻居.这导致我在CPU中节省了17%到12%.

还有可配置的fps和显示窗口的高度/宽度(我认为它足够清晰).

  • 这就是我需要的,谢谢!我不得不使用ximagesink而不是glimagesink(它说警告:错误的管道:没有元素"glimagesink").我添加了"method = 0"来使用最近邻插值来进行视频测量,使其更便宜(来自[here](https://groups.google.com/d/msg/gstreamer-java/1WiZrIy9ziM/8P293) -sLR4EJ)) (2认同)