吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4665|回复: 6
上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
laozhhaiJohn 发表于 2021-4-4 17:27 回帖奖励
本帖最后由 laozhhaiJohn 于 2021-4-23 14:36 编辑

[AutoHotKey]艰难自学之: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中。
[Shell] 纯文本查看 复制代码
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。
[Actionscript3] 纯文本查看 复制代码
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
        ;Hide  or  min
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命令可以结束录制了。
[Actionscript3] 纯文本查看 复制代码
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值。





免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
remenbo + 1 用心讨论,共获提升!
Jedis + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
daimmon 发表于 2021-6-10 13:47
换个录屏软件应该好解决
3#
lj149446 发表于 2021-6-22 15:22
我也在学这个软件,我是纯小白,学起来更痛苦。
4#
 楼主| laozhhaiJohn 发表于 2021-6-24 06:14 |楼主
lj149446 发表于 2021-6-22 15:22
我也在学这个软件,我是纯小白,学起来更痛苦。

坚持一下,逐渐提高。













到最后,就会放弃。哈哈我就这样
5#
igood 发表于 2021-8-4 22:25
学习了,小白一枚也在学习
6#
lff283 发表于 2022-11-8 11:52
66666学习了
7#
shenwang250 发表于 2022-11-8 12:01
大神。膜拜一下。 小白学习中。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表