Поворот значений сходства в пакетном скрипте для цикла
В 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!%
из-за того, как работает расширение переменных).
Изменить: украл немного математики Магу для графа.