最近在做项目,需要用到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}')