ich werf mal meine Batch in den Raum die ich für reencode nehme
Bei mir sieht es so aus:
Filmeordner/Filmename/filmname.mkv
im Filmeordner liegt die ffmpeg.exe, ffprobe.exe und das batch script unten
-> minfilesize = Mindestgröße für ne mp4 / mkv für reencode
Gibt es einen Hit, also eine Datei die ein Reencode ausgehend ihrer Größe braucht, dann fertige ich ein Sample an. Ab Minute 25:00 ein 1 Min langes Sample um die Quali etwas anzugleichen je nach "Grain".
Zudem konvertiere ich nur wenn der Film nicht schon im Encode ist (.lck Datei existiert)
cfr wird also je nach Sample Größe variiert.
Nach dem Sample wird der Film bei mir nach D:\Temp kopiert, da gewandelt, das Ergebnis zurückgespielt.
HDR Metadaten muss man leider von Hand eingeben, hab keinen Weg gefunden das automatisch zu übernehmen. Dazu gehört maxCll maxfall und Mastering Display
Kann man aber über set HDR=0 deaktivieren (deaktiviert by default)
10 Bit HEVC machen die Lines unten. Audio wird 1:1 übernommen, lässt sich ja aber anpassen zb auch OPUS 7.1.
Code:
@echo off
setlocal EnableDelayedExpansion
set CQ=23
set a_bitrate=320
set workingdir=D:\Temp
if not exist %workingdir% mkdir %workingdir%
copy ffmpeg.exe %workingdir% /Y > NUL
copy ffprobe.exe %workingdir% /Y > NUL
for /R %%f in (*.mkv,*.mp4) do (
echo processing file %%f
REM init
set convert=1
REM default quality
set CQ=23
REM minimum file size to convert
set minfilesize=30000000
set channels_0=
set channels_1=
set bitrate_0=
set bitrate_1=
set audio_param_0=
set audio_param_1=
set copyaudio=1
REM set mapping
rem set mapping=-map v:0 -map a -map -0:a:m:language:eng -map s? -map d? -map t?
set mapping=-map v:0 -map a -map s? -map d? -map t?
REM set x265 params
set x265params=:rc-lookahead=35:ssim-rd=1:ctu=32:pbratio=1.22:subme=3:aq-mode=3:level-idc=5.1:high-tier=1:aq-strength=1.2:qcomp=0.64:no-sao=1:rd=4:psy-rd=2.5:psy-rdoq=3.5:rdoq-level=2:bframes=8:no-strong-intra-smoothing=1:weightb=1:b-intra=1:rect=1:limit-modes=1
REM set 10 Bit Mode
set 10Bit=1
REM enable HDR metadata input
set HDR=0
REM get file size
set size=%%~zf
set size=!size:~0,-3!
echo file size is !size!MB
if !size! leq !minfilesize! (
echo skipping "%%~pf%%~nf.mkv" as file is smaller than !minfilesize!MB
rem pause
set convert=0
)
if exist "%%~pf%%~nf.lck" (
echo skipping "%%~pf%%~nf.mkv" as folder already processing
set convert=0
)
if exist "%%~pf%%~nf_x265_10Bit_.mkv" (
echo skipping "%%~pf%%~nf.mkv" as export file exists
set convert=0
)
if exist "%%~pf%%~nf_x265_10Bit.mkv" (
echo skipping "%%~pf%%~nf.mkv" as export file exists
set convert=0
)
if exist "%%~pf%%~nf_x265.mkv" (
echo skipping "%%~pf%%~nf.mkv" as export file exists
set convert=0
)
if exist "%%~pfdone.txt" (
echo skipping "%%~pf%%~nf.mkv" as export file exists
set convert=0
)
echo convert is !convert!
if !convert!==1 (
REM set audio depending on copy mode
set audio_param_0= -c:a copy
set audio_param_1=
if !copyaudio!==0 (
REM analyse Audio Channels and set Bitrate
del temp.txt
call ffprobe -loglevel error -select_streams a:0 -show_entries stream=channels -of default=nw=1:nk=1 "%%f" > temp.txt
set /p channels_0=<temp.txt
call ffprobe -loglevel error -select_streams a:1 -show_entries stream=channels -of default=nw=1:nk=1 "%%f" > temp.txt
set /p channels_1=<temp.txt
echo amount of audio channels stream 0: !channels_0!
echo amount of audio channels stream 1: !channels_1!
if !channels_0! ==2 set bitrate_0=128
if !channels_0! gtr 2 set bitrate_0=192
if !channels_0! gtr 5 set bitrate_0=256
if !channels_0! gtr 7 set bitrate_0=320
if !channels_1! ==2 set bitrate_1=128
if !channels_1! gtr 2 set bitrate_1=192
if !channels_1! gtr 5 set bitrate_1=256
if !channels_1! gtr 7 set bitrate_1=320
REM opus audio on audio encode (choose one, OPUS default)
if defined bitrate_0 set audio_param_0= -c:a libfdk_aac -profile:a aac_he -vbr 5
REM opus audio on audio encode
if defined bitrate_0 set audio_param_0= -c:a libopus -b:a:0 !bitrate_0!k -af aformat=channel_layouts="7.1|5.1|stereo" -vbr on -compression_level 10
if defined bitrate_1 set audio_param_1= -b:a:1 !bitrate_1!k
if not defined bitrate_0 (
if not defined bitrate_1 (
echo skipping "%%~pf%%~nf.mkv" as no audio tracks detected
pause
set convert=0
)
)
REM calculate bitrate
echo Channel 0 Bitrate is !bitrate_0!
echo Channel 1 Bitrate is !bitrate_1!
echo audio_param_0 is !audio_param_0!
echo audio_param_1 is !audio_param_1!
)
REM copy ffmpeg to encoding dir
copy ffmpeg.exe %workingdir% /Y > NUL
echo converting required
REM create lock file so multiple batches can be ran the same time
echo lock file
echo lock > "%%~pf%%~nf.lck"
echo creating sample of "%%f" with audio at %a_bitrate%k and CQ at !CQ!
REM set pixel format
set pixelformat=
if !10Bit!==1 set pixelformat= -pix_fmt yuv420p10le
set HDRparam=
if !HDR!==1 (
REM set HDR values (use media Info to analyse)
echo Mastering display luminance max:
set /p mdmax=||set mdmax=4000
echo max luminance was set to !mdmax!
echo.
echo Mastering display luminance min:
set /p mdmin=||set mdmin=50
echo min luminance was set to !mdmin!
echo.
echo Maximum Content Light Level MaxCLL:
set /p MaxCLL=||set MaxCLL=0
echo Maximum Content Light Level MaxCLL was set to !MaxCLL!
echo.
echo Maximum Frame-Average Light Level MaxFALL:
set /p MaxFALL=||set MaxFALL=0
echo Maximum Frame-Average Light Level MaxFALL was set to !MaxFALL!
set luminance_params=
if !MaxCLL! gtr 0 set luminance_params=:max-cll=!MaxCLL!,!MaxFALL!
set HDRparam=:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=G^(13250,34500^)B^(7500,3000^)R^(34000,16000^)WP(15635,16450^)L^(!mdmax!0000,!mdmin!^)!luminance_params!
)
REM create sample starting at min 25 for 1 minute
echo start /low /wait %workingdir%/ffmpeg -y -i "%%f" -ss 00:25:00 -t 00:01:00 -max_muxing_queue_size 9999!pixelformat! !mapping! -c:v libx265 -x265-params "crf=!CQ!!x265params!!HDRparam!"!audio_param_0!!audio_param_1! -c:s copy "%workingdir%\%%~nf_sample.mkv"
start /low /wait %workingdir%/ffmpeg -y -i "%%f" -ss 00:25:00 -t 00:01:00 -max_muxing_queue_size 9999!pixelformat! !mapping! -c:v libx265 -x265-params "crf=!CQ!!x265params!!HDRparam!"!audio_param_0!!audio_param_1! -c:s copy "%workingdir%\%%~nf_sample.mkv"
pause
echo converted to x265 with CQ !CQ! and audio at %a_bitrate%k
REM set final quality mode depending on sample size
for %%a in ("%workingdir%\%%~nf_sample.mkv") do (
echo sample size is %%~za
if %%~za lss 30000000 set CQ=20
if %%~za gtr 30000000 set CQ=21
if %%~za gtr 45000000 set CQ=22
if %%~za gtr 60000000 set CQ=22
if %%~za gtr 75000000 set CQ=23
if %%~za gtr 125000000 set CQ=24
if %%~za gtr 220000000 set CQ=25
if %%~za gtr 300000000 set CQ=26
if %%~za gtr 450000000 set CQ=27
)
echo using quality mode ou !CQ! for "%%f"
set dir=%%~pf
set dir=!dir:~0,-1!
echo copy "%%f"" to working dir from !dir!
robocopy "!dir!" "%workingdir%" "%%~nf.mkv"
if not exist "%workingdir%\%%~nf_x265_10Bit.mkv" (
start /low /wait %workingdir%/ffmpeg -y -i "%workingdir%\%%~nf.mkv" -max_muxing_queue_size 9999!pixelformat! !mapping! -c:v libx265 -x265-params "crf=!CQ!!x265params!!HDRparam!"!audio_param_0!!audio_param_1! -c:s copy "%workingdir%\%%~nf_x265_10Bit.mkv"
if %errorlevel% == 0 (
echo convert successfull
del "%%~pf%%~nf.lck"
del "%workingdir%\%%~nf.mkv"
echo converted to x265 with CQ !CQ! and OPUS audio at !audio_param_0! !audio_param_1! > %workingdir%\%%~nf_convert.txt
move "%workingdir%\%%~nf_x265_10Bit.mkv" "!dir!"
echo move "%workingdir%\%%~nf_x265_10Bit.mkv" "!dir!"
echo unlocking folder
) else (
echo Converting failed
rem del "%workingdir%\%%~nf_x265.mkv"
echo converted to x265 with CQ !CQ! and OPUS audio at !audio_param_0! !audio_param_1! > %workingdir%\%%~nf_convert_failed.txt
echo unlocking folder
del "%%~pf%%~nf.lck"
pause
goto :break
)
) else (
echo skipping "%workingdir%\%%~nf_x265_10Bit.mkv" as export file in specified quality exists
echo unlocking folder
del "%%~pf%%~nf.lck"
)
echo copy converted file back to original folder
del "%%~pf%%~nf.lck"
)
)
goto :eof