Wie codiere ich mehrere Videos in einer Batch Datei (ffmpeg)?
ECHO
ffmpeg -f concat -safe 0 -i "videos.txt" -map 0:v -map 0:a -c:v copy -c:a copy c_out_list.mp4
PAUSE
____________________________________________________________________________________
Mit diesem Code werden mehrere Videos zu einem zusammengefügt. Wie mache ich es, dass alle Videos einzeln ausgegeben werden?
Zusätzliche Information: Ich kann kein Batch. Ich kenne mich nur gerade so noch aus, dass ich mit ffmpeg ab und zu ein Video neu codiere. Die ffmpeg Dokumentation hilft mir da auch fast immer.
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