Wie codiere ich mehrere Videos in einer Batch Datei (ffmpeg)?

1 Antwort

Mal abgesehen davon, dass das einzelne "encoden" mit dem Streamcopy-parameter für audio und video in eine neue Datei keinen Sinn macht ...

wäre es mühselig Dir jetzt aus dem Stand Batch for-schleifen zu leeren.

Die einfachste Variante wäre ein Droptarget :

for %%a in (%*) do (
    ffmpeg -hide_banner  -i "%%~a"  -c:v copy  -c:a copy   "%%~dpna.neu.mp4"
)

damit genügt es die gewünschten Dateien auf die Batch zu ziehen.

Ansonsten screib einfach was Dir das so vorschwebt.

Wie gesagt , -c:v copy -c:a copy , macht beim einzelnen Dateien keinen Sinn.

Im folgenden eine etwas komfortablere Batch aus meinem eigenen Archiv. diese sucht beim ersten Start automatisch die aktuellste? Version von ffmpeg.exe (das kann bei einem großen Laufwerk etwas dauern, macht es aber nur einmal.)

in der Subroutine :encodeVideo sind im vorliegenden Fall für den Audiooutput: aac vbr 0.9 und für Video: x264 mit Qualitativ hochwertiger Motionsearch und opimaler variabler Bitrate (CFR 23) entspricht ca.5000kbps bei 720p Video

reencode.cmd

@echo off
setlocal enabledelayedexpansion
:var
set "self=%~n0"
set "self.full=%~f0"
set "self.cfg_file=%temp%\curent_FFmpeg.cfg"
if exist %self.cfg_file% (
  rem import some constant variables from file (this is much faster then searching for file and programs each time)
  for /f  "usebackq delims=" %%a in (%self.cfg_file%) do ( set "%%a") 
)
call :find_newest "ffmpeg.exe" self.ffmpeg
::set "self."


call :getTimeStamp TimeStamp 


if "%~1"=="" echo ziehe Videodateien auf  diese Batch: "%~0"
for %%a in (%*) do (
    call :encodeVideo "%%~a" "%%~dpna.%TimeStamp%.mp4"
)




pause
exit /b 


:::::: Subroutines :::::::::


:encodeVideo param: %1=VideoInput  %2=VideoOutput
  rem nativ aac  vbr param 1 0.1 to 2.  set the  minimum Bitrate between 10 to 127 while max Bitrate is 128 (0.1 is horrible)
set "audioParameter=-c:a aac -q:a 0.9"
  rem for now seems cbr the best solution for a quick and Dirty encoding
::set "audioParameter=-c:a aac -b:a 112k "
  rem crf 27 is for small files  using in whatsapp etc  , crf 23 is normal Quality ... lower is better  crf 18 is HQ Video
set "videoParameter=-c:v libx264 -preset slow -tune film -profile:v high -level 4.1 -crf 23 -partitions all -me_method umh -subq 9"
  rem very quick 
::set "videoParameter=-c:v libx264 -preset fast -crf 27 -shortest"


 rem alles außer  counter  ausblenden: -loglevel quiet -stats 
%self.ffmpeg% -hide_banner  -i "%~1"  %videoParameter%  %audioParameter%   "%~2"
exit /b




:find_newest filename  [Variable for result]
echo Suche neueste ffmpegversion  auf Laufwerk c:...
if exist !%~2! ( echo using: !%~2! & exit /b 0)
setlocal
for /f "delims=" %%F in ('dir /b /s "c:/%~1" 2^>nul') do (
      rem find last modified file version
    set "last_val=!new_val!"
    set "file_path=%%F"
      rem wmic need doubling backslashes  in name=-filter!
    for /f "usebackq skip=2 tokens=2-4* delims=," %%f in (`wmic datafile where "name='!file_path:\=\\!'"  get creationdate^,lastaccessed^,lastmodified^,name  /format:csv`) do (
        for /f "tokens=1,4,7 delims=.+" %%a in ("%%f+%%g+%%h")  do (
            set "new_val=%%c"
    )   )
    if [!new_val!] gtr [!last_val!]  (set "best_version="%%F"")
)
endlocal & set "%~2=%best_version%"
if exist !%~2! (set self.>%self.cfg_file% & exit /b 0)
exit /b 1


:getTimeStamp   param: %1=VariableName [%2=length] default=15 (yymmddHHMMSS3ms)
for /f "skip=2 tokens=2,3 delims=,.+" %%a in ('wmic os get localdatetime /format:csv') do (
    set "%~1=%%a%%b"
    if "%~2"=="" (set "%~1=!%~1:~2,15!") else (set "%~1=!%~1:~2,%~2!")
)
exit /b