在循环的批处理脚本中轮换亲和力值

Rotate affinity values in a batch script for loop

在 windows 8.1 中,我使用 FFmpeg 将我的视频转换为 HEVC,使用这个简单的批处理脚本:

md hevc

start /affinity 0x7 for %%k in (*.mkv *.mp4) do ffmpeg -i "%%k" -map 0 -c copy -c:v libx265 -y "hevc\%%~nk.mkv"

我正在使用 Start /affinity 将 FFmpeg 限制为 3/4 线程,否则我的计算机会卡住。它工作正常,除了它对整个文件夹使用相同的亲和力值,我宁愿在 0x7、0xb、0xd 和 x0e 之间轮换亲和力值,这样每次另一个视频开始时它都会更改活动核心。我试过将 start /affinity 放在命令行的不同位置,我试过 运行 一个循环中的一个循环,但我试过的都没有用。有什么想法吗?

这可能看起来有点麻烦,但应该可以解决问题。

@echo off
setLocal enableDelayedExpansion
set c=0
set d=0

md hevc 2>nul

for %%c in (0x7, 0xb, 0xd, x0e) do (
    set c!c!=%%c
    set /a c+=1
)

for %%k in (*.bat) do (
    for /l %%a in (0,1,%c%) do if %%a==!d! set core=!c%%a!
    start /affinity !core! ffmpeg -i "%%k" -map 0 -c copy -c:v libx265 -y "hevc\%%~nk.mkv"
    set /a d=(1+d^) %% 4
)

一个解释:

第一个 for 循环是为了让您可以拥有动态数量的内核。在本例中,它创建了四个名为 c0c1c2c3.

的变量
for %%c in (0x7, 0xb, 0xd, x0e) do (
    set c!c!=%%c
    set /a c+=1
)

我没有在 for 循环前面使用 start 命令,而是将它用于 ffmpeg 命令,这样每次转换都会使用不同的内核。

start /affinity !core! ffmpeg ...

第二个 for 循环有一个计数,因此它可以继续使用四个核心中的下一个 c0,然后 c1,等等。for 循环中的 for 循环只是设置一个变量这是正确的核心(因为由于变量扩展的工作方式,你不能只做 %c!d!%)。

编辑:偷了 Magoo 的一点点数学知识。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET /a selection=0
for %%k in (*.mkv *.mp4) do  (
 FOR %%a IN (0:0x7 1:0xb 2:0xd 3:0xe) DO FOR /f "tokens=1,2delims=:" %%c IN ("%%a") DO IF !selection!==%%c ECHO(start "%%k" /affinity %%d ffmpeg -i "%%k" -map 0 -c copy -c:v libx265 -y "hevc\%%~nk.mkv"
 SET /a selection=(1+selection^) %% 4
)
GOTO :EOF

这应该按照你的要求去做。 ffmpeg 行是 echo 用于测试目的。要激活进程,删除 ECHO(

我在 start 之后添加了一个 "%%k" 作为 window-title,因为 sart 使用该行中找到的第一个引号字符串。

该过程只是将变量 selection 从 0 循环到 3,并为每个 ffmpeg 发送更改它。 delayedexpansion机制用于提供对selection

的run-time值的访问