公司内网不让装录屏软件,于是我用 ffmpeg 自己封装了一个 CLI 工具 - V2EX
爱意满满的作品展示区。
gdjdkid2014

公司内网不让装录屏软件,于是我用 ffmpeg 自己封装了一个 CLI 工具

  •  
  •   gdjdkid2014 May 17 2207 views

    公司内网不让装录屏软件,于是我用 ffmpeg 自己封装了一个 CLI 工具

    起因很简单:公司内网管控比较严,录屏软件装不上,OBS 装不了,Win+G 又没有权限开,但 ffmpeg 不知道为什么没有被拦它就静静地躺在某个服务器目录里,能用。

    于是就想着,ffmpeg 本身支持录屏,能不能把那一长串命令参数封装一下,做成一个随时能跑的小工具,录完就走,不依赖任何需要安装权限的软件。

    就这样写了这个东西,叫 ScreenRecorder-cli

    项目地址:
    https://github.com/gdjdkid/ScreenRecorder-cli


    痛点在哪

    ffmpeg 本身当然能录屏,但命令太难记了,每次临时录东西都要现查参数:

    ffmpeg -f gdigrb -framerate 30 -i desktop \ -f dshow -i audio="virtual-audio-capturer" \ -f dshow -i audio="麦克风 (Conexant ISST Audio)" \ -filter_complex "[1:a][2:a]amerge=inputs=2[a]" \ -map 0:v -map "[a]" \ -c:v libx264 -crf 23 -preset veryfast \ -c:a aac -b:a 128k \ recording_2025-05-17_10-30-00.mp4 

    音频设备名拼错一个字符就报错,时间戳要手动写,输出路径每次都要重新指定。在工作中临时录个演示或者操作步骤,效率反而比直接截图还低。

    所以我想做的事情就一件:把这些参数固化下来,音频设备名保存一次,之后一条命令搞定。


    目前实现了什么

    • 跨平台:Windows 用 gdigrab + dshow,macOS 用 avfoundation,Linux 用 x11grab + pulseaudio
    • 音频设备名保存到本地配置文件,下次启动直接复用
    • 默认输出目录可配置,也可以每次用 -o 临时覆盖
    • 安装时自动检测 ffmpeg 是否在 PATH 里,没有的话给出安装提示
    • Ctrl+C 优雅退出(向 ffmpeg stdin 写 q,不产生损坏文件)
    • 输出文件名自动带时间戳:recording_YYYY-MM-DD_HH-MM-SS.mp4
    • 无需安装权限,只要 ffmpeg 在 PATH 里,npm install -g 之后就能用

    基本用法

    # 安装 npm install -g screenrecorder-cli # 第一次用,先查一下有哪些音频设备 screenrec devices # 把设备名保存到配置,之后不用再输 screenrec set-device --mic "麦克风 (Conexant ISST Audio)" --system "virtual-audio-capturer" # 开始录制,Ctrl+C 停止,文件自动保存 screenrec start # 临时指定输出路径和帧率 screenrec start -o D:\Videos -r 60 # 不录音频 screenrec start --no-audio # 查看当前配置 screenrec show-config 

    有几个地方没想清楚,想听听意见

    1. Windows 系统音频需要额外装一个驱动
    录系统声音需要装 screen-capture-recorder(开源的 DirectShow 驱动),不装只能录麦克风。在内网受限环境下这个驱动不一定能装,目前没找到绕过的方式,只是在文档里说明了。

    2. Linux 部分是按文档写的,没有实机测过
    我自己用 Windows ,Linux 下 x11grab + pulseaudio 的逻辑是照着 ffmpeg 文档写的,不同发行版差异可能不小。有 Linux 用户的话能帮忙验证一下吗。

    3. 只能录全屏
    目前没有窗口选择或区域选择。ffmpeg 的 gdigrab 支持 -i title=窗口标题,但窗口标题需要手动输入,不太实用。有没有更好的思路?

    4. 输出格式写死了 mp4
    编码用 libx264 ,没有其他格式的选项。有没有人有别的格式需求?


    技术栈

    • Node.js ,CJS ,无额外框架
    • commander 做参数解析
    • 底层是 child_process.spawn 调 ffmpeg ,没用任何 ffmpeg npm wrapper

    最开始只是为了解决自己工作里的问题,后来整理了一下结构,加了跨平台支持,就顺手放出来了。如果有人在类似受限的内网环境下办公,或者单纯想要一个轻量的命令行录屏方案,可以试一下。

    macOS 和 Linux 用户帮忙验证一下跨平台逻辑有没有问题就更好了,Issues 和 PR 都欢迎。

    14 replies    2026-05-18 00:53:57 +08:00
    409164
        1
    409164  
       May 17
    这个很方便
    gdjdkid2014
        2
    gdjdkid2014  
    OP
       May 17 via iPhone
    @409164 感谢老哥的肯定
    noqwerty
        3
    noqwerty  
       May 17
    感觉不如写个 shell alias 没必要再引入一个 node 依赖吧
    gdjdkid2014
        4
    gdjdkid2014  
    OP
       May 17 via iPhone
    @noqwerty 没错,我确实在公司本地写了个 shell 脚本,然后 alias 直接在 git bash 用,很方便
    boy666
        5
    boy666  
       May 17 via Android
    不让装软件的本意就是不让录屏吧..
    gdjdkid2014
        6
    gdjdkid2014  
    OP
       May 17 via iPhone
    @boy666 上有政策下有对策
    Rwing
        7
    Rwing  
       May 17   1
    那个啥,等 hr 开除你的时候可是不需要赔偿的哦

    根据《中华人民共和国劳动合同法》第三十九条规定,劳动者严重违反用人单位的规章制度,用人单位可以解除劳动合同,且无需支付经济补偿。
    loading
        8
    loading  
       May 17 via Android
    既然不让录就是工作上根本没有录屏需求,你这录了是为了干啥呢?


    @Rwing 甚至开除时还省了想理由,哈
    0d
        9
    0d  
       May 17
    @loading 可能是录工时或者是每日打卡吧,以备不时之需。之前咨询过律师,说这个录屏证据还挺有用的。
    gdjdkid2014
        10
    gdjdkid2014  
    OP
       May 17
    @loading 英文说的很快,有时候不复盘跟不上,工作用途而已,有啥乱七八糟的想法。。。
    lxxiil
        11
    lxxiil  
       May 17 via iPhone
    试试免安装版的录屏软件
    gdjdkid2014
        12
    gdjdkid2014  
    OP
       May 17
    @lxxiil 有很多,不一定能下载
    lxxiil
        13
    lxxiil  
       May 18 via iPhone
    @gdjdkid2014 rar 格式也不能下载?
    gdjdkid2014
        14
    gdjdkid2014  
    OP
       May 18
    @lxxiil 内网有很多不能
    About     Help     Advertise     Blog     API     FAQ     Solana     5985 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 03:16 PVG 11:16 LAX 20:16 JFK 23:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86