如何使用ffmpeg录制特定窗口?

时间:2014-08-20 04:33:34

标签: ffmpeg window record gdi screen-capture

我使用ffmpeg使用以下代码记录窗口:

ffmpeg.exe
-f dshow 
-y 
-i video="screen-capture-recorder":audio="virtual-audio-capturer":audio="Microphone (USB Audio Device)" 
-framerate 15 
-vcodec libx264 
-crf 0 
-preset ultrafast 
-acodec pcm_s16le 
-vf crop=Width:Height:Left:Top 
output.flv

但问题是我可能会移动窗口,这会导致录制一个没有我想要的窗口的区域。

如何捕获我能够移动它的特定窗口?


修改:我还使用gdigrab来捕获我的窗口(例如Skype),而不是dshow

ffmpeg.exe
-y
-f dshow
-i audio="virtual-audio-capturer":audio="Microphone (USB Audio Device)"
-f gdigrab
-draw_mouse 0
-i title="Skype"
-framerate 30
-vcodec libx264
-crf 0
-preset ultrafast
-acodec pcm_s16le
output.flv

但会议是黑色的......

6 个答案:

答案 0 :(得分:5)

此示例适用于我:

ffmpeg -f gdigrab -framerate 30 -i title="german.avi - VLC media player" -b:v 3M  germ.flv

其中“title”表示目标窗口的实际标题。

希望这会有所帮助。

答案 1 :(得分:4)

我也在寻找在线解决方案,但对找到的答案不满意。我现在摆弄了这个针对Linux的非常简单的解决方案:

C:\Users\pc\AppData\Roaming\nvm\v12.18.3
  • 执行此命令后,可以使用鼠标指针选择窗口

  • 目标文件名在当前目录中的格式为ffmpeg -f x11grab -framerate 25 \ $(xwininfo | gawk 'match($0, /-geometry ([0-9]+x[0-9]+).([0-9]+).([0-9]+)/, a)\ { print "-video_size " a[1] " -i +" a[2] "," a[3] }') \ $(date +%Y-%m-%d_%H-%M_%S).mp4

  • awk魔术只是解析窗口信息。这很丑陋,并且只能与gnu awk一起使用,但是我还没有找到一种更好的方法将窗口几何解析为自定义格式。

在屏幕上记录特定矩形的语法是:

YYYY-mm-dd_hh_mm_ss.mp4

我相信,它也应该在Windows和dshow下工作。

答案 2 :(得分:1)

ffmpeg -rtbufsize 1500M -f dshow -i audio =" virtual-audio-capturer" -f gdigrab -framerate 30 -draw_mouse 1 -i title = RecordWindow -pix_fmt yuv420p -profile:v baseline -y Huangbaohua.mp4

RecordWindow是指定窗口的标题。

答案 3 :(得分:1)

它在here中提到:

  

默认情况下,它会捕获"全屏"主桌面监视器   (所有窗户,重叠,从那里,与航空如果vista +,没有   透明窗口,如果非航空)。

     

要以不同方式配置,请运行提供的"配置设置   公用事业/快捷方式"或者在开始运行之前调整注册表设置   (仅限高级用户):

     

HKEY_CURRENT_USER \ SOFTWARE \屏幕捕获记录器

     

使用DWORD键来考虑start_XXX等...(参见附带的文件   {安装目录} \ configuration_setup_utility \ setup_screen_tracker_params.rb   有关可用的注册表项值的完整列表,或参见   https://github.com/rdp/screen-capture-recorder-to-video-windows-free/blob/master/configuration_setup_utility/setup_screen_tracker_params.rb#L9   )

     

ex:请参阅configuration_setup_utility \ incoming.reg文件(虽然NB那个   这些值是十六进制的,所以编辑该文件有点单调乏味 - 我   总是只使用regedit或附带的脚本实用程序而不是   手工编辑。)

     

To" reset"值删除其键。

你可以在here中看到有这些注册选项:

  • capture_height
  • capture_width
  • start_x
  • start_y
  • default_max_fps
  • stretch_to_width
  • stretch_to_height
  • stretch_mode_high_quality_if_1
  • hwnd_to_track
  • disable_aero_for_vista_plus_if_1
  • track_new_x_y_coords_each_frame_if_1
  • capture_mouse_default_1
  • capture_foreground_window_if_1
  • dedup_if_1
  • millis_to_sleep_between_poll_for_dedupe_changes
  • capture_transparent_windows_including_mouse_in_non_aero_if_1_causes_annoying_mouse_flicker
  • hwnd_to_track_with_window_decoration

答案 4 :(得分:0)

我用它来记录提示

ffmpeg -rtbufsize 1500M -f dshow -i audio="Microfono (8- Logitech USB Headset)" -f gdigrab -framerate 30 -draw_mouse 1 -i title="Prompt dei comandi" -pix_fmt yuv420p -profile:v baseline -y output\output3_xp.mp4
pause

但是它仅适用于提示或其他可分割屏幕尺寸的100x20(colxrow),否则会给我一个错误,这是

[libx264 @ 0000027c7ed66200] width not divisible by 2 (269x432)
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!

P.S .:其他宽度或高度均不够的窗户也存在此问题。我在Python中使用tkinter创建了一个窗口,但出现了错误,然后给了该窗口一些几何形状(300x500),它可以正常工作...

奇怪的是,鼠标有点偏移...

答案 5 :(得分:0)

我改进了 MaxC 回答中的命令。

该命令的一个问题是区域位置不考虑多显示器布局。 geometry 行中的 x 和 y 是相对于当前监视器的,因此无法记录其他监视器中的窗口。

信息被解析为单独的行。并考虑了窗口边框。还添加了倒计时,让用户做好准备。这是脚本:

#!/bin/sh
xwininfo | {
    while IFS=: read -r k v; do
        case "$k" in
        *"Absolute upper-left X"*) x=$v;;
        *"Absolute upper-left Y"*) y=$v;;
        *"Border width"*) bw=$v ;;
        *"Width"*) w=$v;;
        *"Height"*) h=$v;;
        esac
    done
    for i in 3 2 1; do echo "$i"; sleep 1; done
    ffmpeg -y -f x11grab -framerate 30 \
           -video_size "$((w))x$((h))" \
           -i "+$((x+bw)),$((y+bw))" screenrecord.mp4
}

我不确定的两件事:

  • 绝对或相对左上角 X/Y 坐标(参见 xwininfo 的输出)?
  • 是否所有 WM/DE 都一致地提供窗口边框信息,即 x 和 y 是否总是指窗口边框外的点?