ffmpeg录制应用程序窗口

最近在做项目,需要用到ffmpeg录制指定的应用程序窗口,网上找了找资料,一般你能找到也就是如下这种方法:

ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -s 1024×768 ~/test.avi

其中,-vd x11:0,0指录制所使用的偏移为 x=0 y=0-s 1024×768指录制视频的大小为1024×768。录制的视频文件为 test.avi,将保存到用户主目录中。

如果你只想录制一个应用程序窗口或者桌面上的一个固定区域,那么可以指定偏移位置和区域大小。使用xwininfo -frame命令可以完成查找上述参数。


但是xwininfo -frame需要你使用鼠标选择要录制的窗口,才能返回窗口的一系列信息(如大小,x,y偏移),要实现自动获取窗口的信息,可以使用正则表达式。

输入xwininfo -help,我们可以看到它的选项及意义。
xwininfo -help
usage:  xwininfo [-options ...]

where options include:
    -help                print this message
    -display host:dpy    X server to contact
    -root                use the root window
    -id windowid         use the window with the specified id
    -name windowname     use the window with the specified name
    -int                 print window id in decimal
    -children            print parent and child identifiers
    -tree                print children identifiers recursively
    -stats               print window geometry [DEFAULT]
    -bits                print window pixel information
    -events              print events selected for on window
    -size                print size hints
    -wm                  print window manager hints
    -shape               print shape extents
    -frame               don't ignore window manager frames
    -english             print sizes in english units
    -metric              print sizes in metric units
    -all                 -tree, -stats, -bits, -events, -wm, -size, -shape


如果你想录制整个屏幕就用xwininfo -root

$ xwininfo -root

xwininfo: Window id: 0x2ad (the root window) (has no name)

  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Relative upper-left X:  0
  Relative upper-left Y:  0
  Width: 1366
  Height: 768
  Depth: 24
  Visual: 0x21
  Visual Class: TrueColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x20 (installed)
  Bit Gravity State: ForgetGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +0+0  -0+0  -0-0  +0-0
  -geometry 1366x768+0+0


你录制窗口需要的三个参数我已经标红,Absolute upper-left X: 0,  Absolute upper-left Y: 0,-geometry后面的1366x768。你需要取出这些选项里的值,接下来正则表达式派上用场了,先看我的命令:

ffmpeg -f x11grab -s $(xwininfo -root | awk '/geometry/ {print $2}' | awk 'BEGIN {FS="+"} {print $1}') -r 25 -i :0.0+$(xwininfo -root | awk '/Absolute upper-left X/ {print $4}'),$(xwininfo -root | awk '/Absolute upper-left Y/ {print $4}') -vcodec libx264 -threads 0 /home/user/capturedvideo.avi

这样,你的-s后面的区域大小就会由以下正则表达式得到:
$(xwininfo -root | awk '/geometry/ {print $2}' | awk 'BEGIN {FS="+"} {print $1}')

解释一下这个正则表达式的意思:

xwininfo -root | awk '/geometry/ {print $2}'会找到geometry这一行并且得到1366x768+0+0,然后用awk 'BEGIN {FS="+"} {print $1}',把+号之前的内容提取出来。具体的你可以去看正则表达式的用法,这里不做过多解释。

x,y偏移位置(-i :0.0+后面的x,y)将会由以下正则表达式得到:
$(xwininfo -root | awk '/Absolute upper-left X/ {print $4}')
$(xwininfo -root | awk '/Absolute upper-left Y/ {print $4}')


这样就大功告成了!


意思大概都明白了,再稍微说一下录制应用程序窗口,你可以先把窗口打开,先用xwininfo查询它的窗口id(Window id: 0x2ad)一个十六进制整数。然后按照上面的方法,假设我要录制的窗口id为0x3e70523,只需要把正则表达式换成:
-s $(xwininfo -id 0x3e70523 | awk '/geometry/ {print $2}' | awk 'BEGIN {FS="+"} {print $1}')
$(xwininfo -id 0x400002e | awk '/Absolute upper-left X/ {print $4}'),$(xwininfo -id 0x400002e | awk '/Absolute upper-left Y/ {print $4}')


先就这样,哦了!以后有问题再补充。转载请注明出处,方便大家交流,谢谢!



你可能感兴趣的:(ffmpeg录制应用程序窗口)