爱意满满的作品展示区。
gdjdkid2014

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

  •  
  •   gdjdkid2014 · 1h 14m ago · 198 views

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

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

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

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

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


    痛点在哪

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

    ffmpeg -f gdigrab -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 都欢迎。

    3 replies    2026-05-17 13:14:56 +08:00
    409164
        1
    409164  
       1h 13m ago
    这个很方便
    gdjdkid2014
        2
    gdjdkid2014  
    OP
       1h 12m ago via iPhone
    @409164 感谢老哥的肯定😃
    noqwerty
        3
    noqwerty  
       50 mins ago
    感觉不如写个 shell alias 😂没必要再引入一个 node 依赖吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2938 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:05 · PVG 14:05 · LAX 23:05 · JFK 02:05
    ♥ Do have faith in what you're doing.