2015-03-18 1 views
0

Dans Windows 8.1, je convertir mes vidéos à HEVC en utilisant FFmpeg, en utilisant ce simple script batch:Rotation des valeurs d'affinité dans un script batch pour la boucle

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" 

J'utilise le menu Démarrer/affinité pour limiter FFmpeg à 3/4 threads, sinon mon ordinateur est bloqué. Cela fonctionne bien, sauf qu'il utilise la même valeur d'affinité pour un dossier entier et que je préfère faire pivoter les valeurs d'affinité entre 0x7, 0xb, 0xd et x0e, afin qu'il change les cœurs actifs chaque fois qu'une autre vidéo démarre. J'ai essayé de mettre le début/l'affinité dans différentes positions dans la ligne de commande, et j'ai essayé d'exécuter une boucle dans une boucle, mais rien de ce que j'ai essayé n'a fonctionné. Des idées?

+0

Je suppose que vos entrées sont la vidéo H.264. Si je me trompe, pourquoi ré-encoder en HEVC? C'est une autre génération de perte et libx265 n'est pas très rapide. – LordNeckbeard

+0

Oui, je convertis d'AVC à HEVC, parce que je reçois des fichiers qui sont 2-6 fois plus petits que AVC, sans perte de qualité, à mes yeux. Je viens juste de commencer, mais j'ai l'impression que plus la résolution est élevée, plus x265 surpasse x264. –

+0

Oui, c'est trop lent, sur ma machine c'est 3 fois plus lent que x264, mais je ne convertis pas tous les fichiers que j'ai, juste ceux que je veux stocker. –

Répondre

0
@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 

Cela devrait faire ce que vous demandez. Les lignes ffmpeg sont echo ed à des fins de test. Pour activer le processus, retirez le ECHO(

J'ai inclus un "%%k" après la start d'agir en tant que fenêtre titre comme sart utilise la première chaîne entre guillemets se trouve sur la ligne.

Le processus fait simplement passer la variable selection de 0 à 3, en la modifiant pour chaque ffmpeg expédiée. Le mécanisme d'expansion retardée est utilisé pour fournir l'accès à la valeur d'exécution de selection

+0

Cela devrait-il être 'SET/a selection = (1+! Selection! ^) %% 4'? :) – unclemeat

+0

@unclemeat: Non. La syntaxe 'set/a' fonctionne sur la valeur courante et * ne nécessite pas de'% 'ou'! ' – Magoo

+0

Merci à vous deux. Vos solutions sont impressionnantes, mais je crains que les deux parties manquent toujours un morceau. Je les ai exécutées et les deux scripts lancent simultanément un processus FFmpeg pour chaque vidéo du dossier, au lieu de traiter les fichiers un par un. Est-il possible d'empêcher la boucle d'avancer jusqu'à la fin du processus FFmpeg précédent? –

0

Cela peut sembler un peu lourd, mais cela devrait faire l'affaire.

@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 
) 

Une explication:

La première boucle est que vous pouvez avoir un nombre dynamique de noyaux. Dans ce cas, il crée quatre variables nommées c0, c1, c2 et c3.

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

Au lieu d'utiliser la commande de démarrage en face de la boucle, je l'ai utilisé pour la commande ffmpeg, ainsi chaque conversion utilisera un noyau différent.

start /affinity !core! ffmpeg ... 

La deuxième boucle a un comptage de manière à pouvoir continuer à utiliser le noyau à côté des quatre c0, puis c1, etc. La boucle à l'intérieur de cette boucle définit seulement une variable qui est le noyau correct (parce que vous ne pouvez pas faire %c!d!% en raison de la façon dont l'expansion variable fonctionne). Edit: a volé le peu de maths de Magoo pour le compte.

+0

Petite question, je voulais demander s'il y a un avantage à définir les valeurs de base dans une boucle, au lieu de directement avec une commande set pour chacun? –

+0

@AlbertAmirGivol Pas particulièrement. – unclemeat