-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathffmpeg_avs.cmd
More file actions
140 lines (114 loc) · 4.32 KB
/
ffmpeg_avs.cmd
File metadata and controls
140 lines (114 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
@echo off & setlocal enabledelayedexpansion
:INIT
chcp 1252 >nul
call :SETESC
set "FF_FLAGS=-v info -hide_banner -stats -err_detect ignore_err -fflags +genpts+igndts"
set "DECODER_PARAM=-hwaccel auto"
echo %ESC%[92mPlease choose (ENTER = ARCHIVE):%ESC%[0m
echo 1 = ARCHIVE, encoded to H.264/AC3
echo 2 = UPSCALE, encoded to FFV1/AC3 for later Topaz upscale
echo 3 = STANDARD, encoded to HEVC/AC3
echo.
set /p CHOICE="Selection: "
if "%CHOICE%"=="2" (
set PROFILE=UPSCALE
) else if "%CHOICE%"=="3" (
set PROFILE=STANDARD
) else (
set PROFILE=ARCHIVE
)
echo %ESC%[104;97m PROFILE: !PROFILE! %ESC%[0m
echo.
:MAIN
if not exist _Converted md _Converted
call :SET_ENCODER_PARAMS
for %%I in (*.avs) do if not exist "_Converted\%%~nI.mkv" (
echo %ESC%[101;93m %%~nI %ESC%[0m
call :CONVERT "%%I"
)
goto :END
:SET_ENCODER_PARAMS
if "%PROFILE%"=="ARCHIVE" goto :ARCHIVE
if "%PROFILE%"=="UPSCALE" goto :UPSCALE
if "%PROFILE%"=="STANDARD" goto :STANDARD
goto :EOF
:ARCHIVE
set ENCODER_ARGS=-c:v h264_nvenc -profile:v high -preset:v p7 -tune:v hq -rc:v vbr -cq:v 24 -multipass:v fullres -spatial-aq:v 1 -temporal-aq:v 1 -aq-strength:v 10 -rc-lookahead:v 24 -refs:v 4 -bf:v 3 -b_ref_mode:v middle -c:s copy -c:t copy
goto :EOF
:UPSCALE
set ENCODER_ARGS=-c:v ffv1 -level:v 3 -coder:v 1 -context:v 1 -g:v 1 -slices:v 16 -pix_fmt:v yuv422p10le -c:s copy -c:t copy
goto :EOF
:STANDARD
set ENCODER_ARGS=-c:v hevc_nvenc -profile:v main -preset:v p7 -tune:v hq -rc:v vbr -cq:v 26 -multipass:v fullres -spatial-aq:v 1 -temporal-aq:v 1 -aq-strength:v 10 -rc-lookahead:v 24 -refs:v 4 -bf:v 3 -b_ref_mode:v middle -c:s copy -c:t copy
goto :EOF
:CONVERT
set "AUDIO_CODECS="
set "BITRATE_AVS="
set "IDX_SOURCE=0"
set "IDX_TARGET=1"
set "INPUT_FILE=%~1"
set "SOURCE_FILE="
set "OUTPUT_FILE=_Converted\%~n1.mkv"
set "HAS_AVS_AUDIO=0"
for /f "usebackq delims=" %%A in (`ffprobe -v error -select_streams a -show_entries stream^=index -of csv^=p^=0 "%INPUT_FILE%" 2^>nul`) do (
set "HAS_AVS_AUDIO=1"
)
if "!HAS_AVS_AUDIO!"=="0" (
echo %ESC%[93mNote: No audio in AVS, using source audio only%ESC%[0m
set "MAP_AUDIO=-map 1:a?"
set "FIRST_AUDIO_FROM_SOURCE=1"
) else (
set "MAP_AUDIO=-map 0:a:0 -map 1:a? -map -1:a:0"
set "FIRST_AUDIO_FROM_SOURCE=0"
)
for %%E in (mkv mp4 avi) do (
if not defined SOURCE_FILE (
if exist "%~n1.%%E" set "SOURCE_FILE=%~n1.%%E"
)
)
if not defined SOURCE_FILE (
echo %ESC%[91mSource file for !INPUT_FILE! not found!%ESC%[0m
goto :EOF
)
if "!FIRST_AUDIO_FROM_SOURCE!"=="1" (
for /f "usebackq tokens=*" %%C in (`ffprobe -hide_banner -v error -select_streams a:0 -show_entries stream^=channels -of default^=noprint_wrappers^=1:nokey^=1 "!SOURCE_FILE!"`) do (
if %%C LEQ 2 ( set "BITRATE_AVS=192k" ) else ( set "BITRATE_AVS=384k" )
)
set "AUDIO_CODECS=-c:a:0 ac3 -b:a:0 !BITRATE_AVS!"
) else (
for /f "usebackq tokens=*" %%C in (`ffprobe -hide_banner -v error -select_streams a:0 -show_entries stream^=channels -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT_FILE%"`) do (
if %%C LEQ 2 ( set "BITRATE_AVS=192k" ) else ( set "BITRATE_AVS=384k" )
)
set "AUDIO_CODECS=-c:a:0 ac3 -b:a:0 !BITRATE_AVS!"
)
set /a "IDX_SOURCE=0"
set /a "IDX_TARGET=1"
for /f "usebackq tokens=1,2 delims=," %%A in (`ffprobe -hide_banner -v error -select_streams a -show_entries stream^=codec_name^,channels -of csv^=p^=0 "!SOURCE_FILE!"`) do (
if !IDX_SOURCE! GTR 0 (
set "CUR_CODEC=%%A"
set "CUR_CHANNELS=%%B"
if !CUR_CHANNELS! LEQ 2 ( set "BITRATE=192k" ) else ( set "BITRATE=384k" )
if /i "!CUR_CODEC!"=="ac3" (
set "AUDIO_CODECS=!AUDIO_CODECS! -c:a:!IDX_TARGET! copy"
) else (
set "AUDIO_CODECS=!AUDIO_CODECS! -c:a:!IDX_TARGET! ac3 -b:a:!IDX_TARGET! !BITRATE!"
)
set /a "IDX_TARGET+=1"
)
set /a "IDX_SOURCE+=1"
)
ffmpeg %FF_FLAGS% %DECODER_PARAM% -i "%INPUT_FILE%" -i "!SOURCE_FILE!" -map 0:v !MAP_AUDIO! -map 1:s? -map 1:t? -map_metadata 1 -map_chapters 1 -metadata:s:a:0 language=ger -disposition:a:0 default -disposition:a:1 0 !AUDIO_CODECS! %ENCODER_ARGS% "%OUTPUT_FILE%"
set "IDX_SOURCE="
set "IDX_TARGET="
set "HAS_AVS_AUDIO="
set "FIRST_AUDIO_FROM_SOURCE="
set "MAP_AUDIO="
goto :EOF
:SETESC
for /f "usebackq delims=" %%A in (`echo prompt $E^| cmd`) do set "ESC=%%A"
set "UL=%ESC%[4m"
set "NO=%ESC%[24m"
exit /b
:END
endlocal
exit /b 0