laozhhaiJohn 发表于 2021-4-4 17:27

[AutoHotKey]艰难自学之:ahk控制ffmpeg录制win10的桌面和声音

本帖最后由 laozhhaiJohn 于 2021-4-23 14:36 编辑

艰难自学之:ahk控制ffmpeg录制win10的桌面和声音

一、缘起
我编写的一个自用小脚本项目,运行脚本后,脚本会自动执行一些自动化操作。
一般我运行脚本后,回去喝水或者取活动活动,并不在电脑前面。
那我就想知道我不在电脑前的时候,脚本和电脑互动是否顺利,有没有什么状况。
于是我在脚本中加入了截屏功能。另外又想:可否自动录屏,等脚本运行过后查看录制的桌面情况,以便发现有什么特殊问题存在。
说干就干,查找资料后,决定试用ffmpeg录屏(也试用了几款录屏软件,配合热键录制和停止录制)。

二、准备
ffmpeg非常复杂,对于我这样的新手而言是很难啃的。上网找了很多材料。得知仅仅录制屏幕视频,ffmpeg就可以了。如果需要录制电脑声音,还需要使用:Screen Capturer Recorder。
因此,录制win10电脑的屏幕视频和win10电脑的声音,需要二者配合,对Screen Capturer Recorder无须过多了解,只需要在ffmpeg中参数调用Screen Capturer Recorder即可。
下载、安装ffmpeg和Screen Capturer Recorder有专门的文章介绍,非常详细,这里不再详述。

三、试验
首先安装网上的资料,编写一个简单bat批处理文件,使用ffmpeg命令行进行试验录制视频,成功后,再加入录制音频的参数进行试验,等2者都没有问题后,将bat批处理内容转化到AutoHotKey中。

ffmpeg -f gdigrab -framerate 30 -offset_x 0 -offset_y 0 -video_size 3040x900 -i desktop -f dshow -i audio="virtual-audio-capturer" -acodec aac -y -f mp4 s:/temp.mp4
四、问题
转化到AutoHotKey中,可以录制音画。但是又大问题,于是本文的重点来了---要想静默开始录制电脑音画,之后可以随时结束录制,是一个看似简单,其实有很多棘手问题的一个问题。
这里解决2个问题,1静默录制,2结束录制。
1静默录制的问题是,ffmpeg运行后,会有一个大黑cmd框非常显眼,想要隐藏。

(大黑CDM框我改成白框了。)
2结束录制。看似简单,暗藏学问。在命令行使用ffmpeg中,需要在cmd中输“Q”命令,结束录制。
或者关闭cmd框,结束录制。
但是,隐藏cmd框之后,会无法点击cmd框按钮关闭cmd框;且隐藏cmd框后,更无法在cmd中发送“Q”命令(Q是命令不是热键)。

五、头大的小问题
首先想到的是ffmpeg本身是否有隐藏自身cmd窗口的命令。在网上找了很久,找不到解决办法。更无从解决隐藏cmd后关闭ffmpeg的问题。
好吧,那就再AutoHotKey中看看能否解决。
首先试验不隐藏cmd窗口,然后用AutoHotKey对ffmpeg进程发送q命令,可以顺利关闭ffmpeg。
DetectHiddenWindows, On
camcapfile := "s:/temp/0000000/" . A_Now . ".MP4"
run,
(Ltrim Join`s
    ffmpeg
      -f gdigrab
      -framerate 12
      -offset_x 0
      -offset_y 0
      -video_size 3040x900
      -i desktop
      -f dshow
      -i audio="立体声混音 (Realtek High Definition Audio)"
      -acodec aac
      -af "volume=-28dB"
      -rtbufsize 1500M
      -y
      -crf 23
      -f mp4 %camcapfile%
      -thread_queue_size 512
), ,, ffmpegPid
      ;Hideormin
Return

!+q::
sleep 200
ControlSend,, q, ahk_pid %ffmpegPid%;close ffmpeg, mp4 ok
Return

然后试验使用AutoHotKey中run命令的“Hide”参数隐藏运行ffmpeg,通过任务管理器可以看到,ffmpeg顺利运行了,且在存放录制的音视频目录中有长度为0的一个正在录制的文件。
但是,这时候无论使用AutoHotKey的哪个send命令,对ffmpeg进程发送q命令都无法成功关闭,ffmpeg会无限制的录制下去,并且,一旦从任务管理器暴力关闭ffmpeg进程,其存盘的视频文件打开就报错,无法使用。
后来,在网友的提示下,使用 WinShow命令,显示ffmpeg窗口后对ffmpeg进程发送q命令可以结束录制了。
camfile := "s:/temp/0000000/" . A_Now . ".MP4"
run,
(Ltrim Join`s
    ffmpeg
      -f gdigrab
      -framerate 30
      -offset_x 1440
      -offset_y 0
      -video_size 1600x900
      -i desktop   
      -f mp4 %camfile%
      -y
), ,Hide ,ffmpegPid

Return

!+a::
WinShow, ahk_pid %ffmpegPid%
Sleep, 3000
ControlSend,, q, ahk_pid %ffmpegPid%
Return
但是,不录制音频的电脑桌面监控视频是不完整的。怎么办呢?我又加上了音频录制参数。
我发现,使用录制音频,脚本用“Hide”参数,在脚本对ffmpeg进程发送显示winshow命令的时候,总是显示一个窗口:


这个窗口每次出现特别烦人,并且对ffmpeg进程的Q命令会失效.

六、解决
看来,运行ffmpeg后,有一些不为人知的小秘密在ffmpeg中发生。为了查明原因,我动用了工具:
Microsoft Spy++ 来查看到底在电脑进程中发生了什么?


这里:1就是ffmpeg正常显示的大黑框CMD窗口。而2则是上面说的那个讨厌的弹出小窗口。
    3则是ffmpeg在脚本中用run命令运行时候保存到变量“ffmpegPid”中的进程id值。





daimmon 发表于 2021-6-10 13:47

换个录屏软件应该好解决

lj149446 发表于 2021-6-22 15:22

我也在学这个软件,我是纯小白,学起来更痛苦。

laozhhaiJohn 发表于 2021-6-24 06:14

lj149446 发表于 2021-6-22 15:22
我也在学这个软件,我是纯小白,学起来更痛苦。

坚持一下,逐渐提高。













到最后,就会放弃。{:301_971:}哈哈我就这样

igood 发表于 2021-8-4 22:25

学习了,小白一枚也在学习

lff283 发表于 2022-11-8 11:52

66666学习了

shenwang250 发表于 2022-11-8 12:01

大神。膜拜一下。 小白学习中。
页: [1]
查看完整版本: [AutoHotKey]艰难自学之:ahk控制ffmpeg录制win10的桌面和声音