Поворот значений сходства в пакетном скрипте для цикла

В Windows 8.1 я конвертирую свои видео в HEVC, используя FFmpeg, используя этот простой пакетный скрипт:

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, чтобы при каждом запуске другого видео активные ядра менялись. Я попытался поместить старт / сходство в разные позиции в командной строке, и я попытался запустить цикл внутри цикла, но ничего, что я пробовал, не сработало. Есть идеи?

2 ответа

Решение
@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(

Я включил "%%k" после start выступать в качестве заголовка окна как sart использует первую строку в кавычках, найденную в строке.

Процесс просто циклически изменяет selection от 0 до 3, меняя его для каждого ffmpeg отправлено. Механизм задержки и расширения используется для обеспечения доступа к значению времени выполнения selection

Это может показаться немного громоздким, но это должно сработать.

@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 позволяет вам иметь динамическое количество ядер. В этом случае он создает четыре переменные с именем c0, c1, c2, а также c3,

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

Вместо использования команды запуска перед циклом for, я использовал ее для команды ffmpeg, таким образом, каждое преобразование будет использовать свое ядро.

start /affinity !core! ffmpeg ...

Второй цикл for имеет счетчик, так что он может продолжать использовать следующее ядро ​​из четырех c0, затем c1и т. д. Цикл for внутри цикла for просто устанавливает переменную, которая является правильным ядром (потому что вы не можете просто сделать %c!d!% из-за того, как работает расширение переменных).

Изменить: украл немного математики Магу для графа.

Другие вопросы по тегам