V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1054850490
V2EX  ›  PowerShell

Windows 运行 ffmpeg 批量脚本的时候,如何在不中断的情况下限制 CPU 使用率

  •  
  •   1054850490 · 2022-10-13 23:44:56 +08:00 · 3939 次点击
    这是一个创建于 769 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为转码的机器也是我正在使用的机器,所以运行的时候是会影响到我日常使用的,但是 ffmpeg 也没法停下来,虽然也可以用续传方法继续上次没完成的进程,奈何我的代码渣,这脚本也是我找别人写的,所以我就想着,能不能在我用的时候限制一下 ffmpeg 的占用?然后等我要睡觉的时候就放开禁用,这中途不能中断,虽然 Windows 任务管理器可以设置限制 CPU 使用核心数,但是“重点”来了,这是个批量脚本,每次轮到下一个视频的时候,任务管理器就会重置刚才的核心数限制,所以想问有没有办法让他设置的限制可以一直保持着就算新进程建立,也会维持之前对这个“程序”的限制
    40 条回复    2022-10-16 20:08:00 +08:00
    soclearn
        1
    soclearn  
       2022-10-13 23:59:28 +08:00
    bash cpulimit
    1054850490
        2
    1054850490  
    OP
       2022-10-14 00:17:33 +08:00
    @minlearn #1 我这是 Windows 环境,包括脚本运行的环境也是 powershell
    xmumiffy
        3
    xmumiffy  
       2022-10-14 00:20:31 +08:00 via Android
    ffmpeg 有参数 threads 没超过总核心数时基本等于用几个核心
    1054850490
        4
    1054850490  
    OP
       2022-10-14 00:22:51 +08:00
    @xmumiffy #3 是有,但是嘛,它并不灵活,它在运行中就不能更改,我想我睡觉的时候放开限制,而我使用的时候再限制个数
    mikewang
        5
    mikewang  
       2022-10-14 00:50:38 +08:00
    start /affinity 1 ffmpeg.exe *************
    1054850490
        6
    1054850490  
    OP
       2022-10-14 01:16:03 +08:00
    @mikewang #5 好像也不适合我,你这个也是开始就写死的,不能在程序运行的途中进行更改
    cxtrinityy
        7
    cxtrinityy  
       2022-10-14 01:31:53 +08:00 via Android
    Powershell 也可以安装到 Linux 吧,wsl 走起,用一楼的 cpulimit 方案试试
    wevsty
        8
    wevsty  
       2022-10-14 01:33:45 +08:00
    POWERSHELL:

    ForEach($PROCESS in GET-PROCESS ffmpeg) { $PROCESS.ProcessorAffinity=1}
    wangyuyang3
        9
    wangyuyang3  
       2022-10-14 01:49:51 +08:00 via Android
    之前我为了指定 VMware 虚拟机调用的 cpu 内核,用了 process lasso 这款软件,实测可以永久记住规则,即使虚拟机进程结束重开。

    你搞个破解版先试试看
    wangyuyang3
        10
    wangyuyang3  
       2022-10-14 01:50:19 +08:00 via Android
    @wangyuyang3 呸,不是内核,是核心数
    wangritian
        11
    wangritian  
       2022-10-14 02:32:52 +08:00
    试试 process lasso
    AX5N
        12
    AX5N  
       2022-10-14 05:18:46 +08:00
    切成 N 片,然后再写一个程序判断你当前是否活动,活动的话下一个任务就低负载,不活动下一个任务就高负载,任务完成后再合并。
    charlie21
        13
    charlie21  
       2022-10-14 05:29:06 +08:00 via iPhone
    可转码速度也会因此变慢
    necomancer
        14
    necomancer  
       2022-10-14 05:51:23 +08:00   ❤️ 1
    任务管理器找到 ffmpeg 然后设置低优先级?
    cnbatch
        15
    cnbatch  
       2022-10-14 06:13:46 +08:00
    换个思路,将 ffmpeg 进程的优先级设置到最低,也许这样更简单一些

    Get-WmiObject Win32_process -filter 'name = "ffmpeg.exe"' | foreach-object { $_.SetPriority(64) }

    加到脚本最后一行
    cnbatch
        16
    cnbatch  
       2022-10-14 06:32:37 +08:00
    @cnbatch
    啊,说得有点不太对了
    应该是,用 & 符号加到脚本每句 ffmpeg 命令的后面
    ysc3839
        17
    ysc3839  
       2022-10-14 07:32:37 +08:00 via Android
    正确做法是用 Job Object 限制
    https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects#job-limits-and-notifications
    不过问题在于可能没有现成的工具,需要自己写代码。
    除此之外较好的做法就是设置 CPU 亲和性了,8 楼的方法应该没啥问题。
    zcf0508
        18
    zcf0508  
       2022-10-14 07:44:46 +08:00 via Android
    process lasso pro
    julyclyde
        19
    julyclyde  
       2022-10-14 08:29:44 +08:00
    @cnbatch &符号??
    tqyq88
        20
    tqyq88  
       2022-10-14 08:51:56 +08:00
    使用 cuda 加速,实测大概是 CPU 的几倍,参考 https://trac.ffmpeg.org/wiki/HWAccelIntro

    ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i test.mp4 -b 1000000 -c:v h264_nvenc -preset slow c2.mp4
    cheng6563
        21
    cheng6563  
       2022-10-14 09:14:00 +08:00
    process lasso pro
    zictos
        22
    zictos  
       2022-10-14 09:21:26 +08:00 via Android
    cmd 命令就可以限制了,有些比较占 cpu 的软件我都是当软件切换到后台就限制只使用 cpu 的一个核心,切换到前台就使用所有核心
    Ljcbaby
        23
    Ljcbaby  
       2022-10-14 10:43:46 +08:00
    @tqyq88 #20 如果有一定的质量要求,建议还是 CPU 而非 cuda ,当然拿 cuda 做解码输入还是可以的
    dog82
        24
    dog82  
       2022-10-14 10:54:11 +08:00
    可以考虑用虚拟机解决
    dog82
        25
    dog82  
       2022-10-14 10:57:44 +08:00
    或者让 ffmpeg 跑在 docker 里
    lookStupiToForce
        26
    lookStupiToForce  
       2022-10-14 11:22:21 +08:00
    ch2
        27
    ch2  
       2022-10-14 12:20:27 +08:00
    mxT52CRuqR6o5
        28
    mxT52CRuqR6o5  
       2022-10-14 12:30:56 +08:00 via Android
    用 start 命令启动 ffmpeg 时设置低优先级,全设置低优先级就行了,你不用电脑的时候没有其他程序抢占资源就能跑满了
    mxT52CRuqR6o5
        29
    mxT52CRuqR6o5  
       2022-10-14 12:31:34 +08:00 via Android
    start /low /wait
    cnbatch
        30
    cnbatch  
       2022-10-14 16:55:24 +08:00
    @julyclyde 其实就是其他 shell 的 & 符号,在 Powershell 里面功能一样
    1054850490
        31
    1054850490  
    OP
       2022-10-14 17:29:02 +08:00
    @tqyq88 #20
    @Ljcbaby #23
    其实就是用来做解码用途的,只是偶尔会遇到 av1 文件就会自动调用 CPU 解码,这就实在没办法了,会把我 CPU 吃满导致我日常也很难使用电脑,只能是等到 30 系显卡价格下来了再买个 30 系来解 av1
    1054850490
        32
    1054850490  
    OP
       2022-10-14 17:35:00 +08:00
    @wevsty #8
    @ysc3839 #17
    8 楼的方法是可以,只是有一个问题,这个循环是轮询的,也就是说 ffmpeg 刚启动的时候会有很短的时间内是没有限制核心数的,如果我正在打 LOL 的话就会突然卡一下,因为这时候会有一个峰值然后才降低,所以也并不太适用
    1054850490
        33
    1054850490  
    OP
       2022-10-14 17:36:36 +08:00
    @wangyuyang3 #9
    @dog82 #24
    虚拟机不太适合我,因为中间的损耗比较高,而且开启虚拟机硬件资源占用也更大了
    ysc3839
        34
    ysc3839  
       2022-10-14 17:57:34 +08:00
    @1054850490 所以说正确的做法是用 Job Object ,把进程加入 Job Object 后子进程都会在 Job Object 内,都会受到限制.
    https://github.com/goldshtn/jobrun 可以看看这个项目,不过似乎没有提供编译好的文件。
    wangyuyang3
        35
    wangyuyang3  
       2022-10-14 18:03:34 +08:00
    @1054850490 不是让你用虚拟机 hhh ,我是说 Process Lasso 可以实现和任务管理器类似的进程关联 CPU 调度设置,而且进程重启会一直记住这个规则,不用重新反复设置。
    jeeyong
        36
    jeeyong  
       2022-10-14 18:56:41 +08:00   ❤️ 1
    直接设置 cpu 相关性不行吗?
    julyclyde
        37
    julyclyde  
       2022-10-14 20:14:05 +08:00
    @cnbatch &符号既不是也不是这个用途啊
    hxy100
        38
    hxy100  
       2022-10-15 03:07:49 +08:00
    Windows 下有个开源的工具叫“Battle Encoder Shirase”(简称 BES ),支持监视尚未运行的进程、监视已经运行结束退出进程,支持以指定限制率运行指定进程,有 GUI 版本,同时也支持命令行调用,完全满足你的需求。

    ---
    官网: https://mion.yosei.fi/BES/

    ---


    mscsky
        39
    mscsky  
       2022-10-15 22:21:00 +08:00
    windows 上的 git 不是带 bash 环境?
    hxy100
        40
    hxy100  
       2022-10-16 20:08:00 +08:00
    @mscsky 并不是所有的 Linux 软件在不修改源代码的前提下都能无缝移植到 Windows 上,一楼所提的那个 cpulimit 就不行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:22 · PVG 23:22 · LAX 07:22 · JFK 10:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.