Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @echo off
- rem Froz 09.03.2016
- rem Устройство #1 (Device 1) 'Panasonic LX7', исходник 1080p/50 MTS/MKV:
- rem // Высокое качество: CRF21: 11-17 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
- rem // Нормальное качество: CRF23: 8-11 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
- rem // Для архива: CRF26: ? Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
- rem // Дерганное видео с мелкими деталями: CRF28: 9-12 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
- set CRFDV1=23
- set MBITDV1=10
- rem Устройство #2 (Device 2) 'Samsung A3', исходник 1080p/30 MP4/MKV:
- rem // Для архива: CRF26: 4 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
- set CRFDV2=26
- set MBITDV2=5
- rem // SHUTPC: 1 = выключить компьютер после кодирования, 0 = не выключать
- set SHUTPC=0
- set CPUFPS=1
- rem ------------------------------------------------------------
- rem Расширения входящих и исходящих файлов
- set IN1=.mts
- set IN2=.mp4
- set IN3=.mkv
- set SOUT=.sup
- set AUDV1=.ac3
- set AUDV2=.aac
- set OUT=%IN3%
- set CNT=0
- title %~nx0: уменьшение видеофайлов.
- if -%1==- goto hlp
- rem Проверка на наличие необходимых утилит:
- :chk
- if exist "%windir%\syswow64\avisynth.dll" goto x64chk
- if exist "%windir%\system32\avisynth.dll" goto x86chk
- echo ---
- echo AviSynth не найден, устанавливаем... Нужен пароль админа!
- "%~dp0bin\AviSynth_260.exe"
- goto chk
- :x64chk
- rem Если Windows 64-bit:
- set x64=1
- set BF=%~dp0bin\x64
- set A2Y="%~dp0bin\avs2yuv.exe"
- if not exist %A2Y% call :inco %A2Y% & goto:eof
- set AVSPL=%programfiles(x86)%\AviSynth\plugins
- goto fchk
- :x86chk
- rem Если Windows 32-bit:
- set x64=0
- set BF=%~dp0bin\x86
- set AVSPL=%programfiles%\AviSynth\plugins
- goto fchk
- :fchk
- rem Продолжение проверки на наличие необходимых утилит:
- set X264="%BF%\x264.exe"
- set MKVE="%BF%\mkvextract.exe"
- set MKVM="%BF%\mkvmerge.exe"
- set MI="%BF%\mediainfo.exe"
- set FFA=FFMS2.avsi
- set FFD=ffms2.dll
- if not exist %X264% call :inco "%X264%" & goto:eof
- if not exist %MKVE% call :inco "%MKVE%" & goto:eof
- if not exist %MKVM% call :inco "%MKVM%" & goto:eof
- if not exist %MI% call :inco "%MI%" & goto:eof
- if not exist "%~dp0bin\%FFA%" call :inco "%~dp0bin\%FFA%" & goto:eof
- if not exist "%~dp0bin\%FFD%" call :inco "%~dp0bin\%FFD%" & goto:eof
- if not exist "%AVSPL%" goto oldavsy
- goto fchk2
- :oldavsy
- echo Похоже установлена старая версия AviSynth (папка "AviSynth 2.5").
- echo Нужно деинсталлировать старую версию штатным установщиком
- echo (чтобы удалилась папка "AviSynth 2.5") и перезапустить скрипт.
- call :inco "%AVSPL%"
- goto:eof
- :fchk2
- if not exist "%AVSPL%\%FFA%" copy /y "%~dp0bin\%FFA%" "%AVSPL%">nul
- if not exist "%AVSPL%\%FFD%" copy /y "%~dp0bin\%FFD%" "%AVSPL%">nul
- goto get
- :get
- rem Проверки на наличие и правильность входящего файла
- if -%1==- goto e
- if not exist %1 (
- echo ---
- echo "%~nx1" не найден, пропускаем.
- goto shft
- )
- if /i not %~x1==%IN1% (
- if /i not %~x1==%IN2% (
- if /i not %~x1==%IN3% (
- echo ---
- echo Расширение файла "%~nx1" не %IN1% / %IN2% / %IN3%, пропускаем.
- goto shft
- )
- )
- )
- if exist "%~dp1%~n1s%OUT%" (
- echo ---
- echo "%~dp1%~n1s%OUT%" уже присутствует, "%~nx1" пропускаем.
- goto shft
- )
- echo ------------------------------------------------------------
- echo Начата обработка "%~nx1"...
- set TXT="%~dp1%~n1.txt"
- set LOG="%~dp1%~n1s.log.txt"
- rem Проверка на наличие в имени файла символов ')' и их временная замена на '_'
- set FNS=%~n1
- set NM=%FNS:)=_%
- set NMF=%NM%%~x1
- if not "%NMF%"=="%~nx1" (
- ren "%~dp1%~nx1" "%NMF%"
- echo ---
- echo "%~nx1" временно переименован в "%NMF%".
- goto :dvchk
- )
- set NM=%~n1
- set NMF=%~nx1
- :dvchk
- rem Проверка на FPS входящего файла (50 или 30) и переход к нужному конфигу девайса:
- for /f "delims=" %%f in ('"%MI% --Inform=Video;%%FrameRate%% "%~dp1%NMF%""') do set FRT=%%f
- if %FRT% LEQ 40 goto dvc2cfg
- rem Конфиг устройства #1 (Device 1)
- set DVC=DV1
- set CRF=%CRFDV1%
- if %CRF% GTR 26 set MBIT=6 & goto sets
- if %CRF% LSS 21 set MBIT=15 & goto sets
- set MBIT=%MBITDV1%
- set AOUT=%AUDV1%
- goto sets
- rem Конфиг устройства #2 (Device 2)
- :dvc2cfg
- set DVC=DV2
- set CRF=%CRFDV2%
- if %CRF% GTR 26 set MBIT=3 & goto sets
- if %CRF% LSS 23 set MBIT=11 & goto sets
- set MBIT=%MBITDV2%
- set AOUT=%AUDV2%
- :sets
- rem Переменные для временных папок/файлов и энкодера:
- set WDIR=%~d1\$tmp$%~n0
- for %%f in ("%~dp1%NMF%") do set DT=%%~tf
- set FNTMP=%WDIR%\$tmp$%DT:~6,4%%DT:~3,2%%DT:~0,2%%DT:~11,2%%DT:~14,2%
- set TRKV="%FNTMP%_$video$%OUT%"
- set TRKA="%FNTMP%_$audio$%AOUT%"
- set TRKS="%FNTMP%_$subs$%SOUT%"
- set WRK=%FNTMP%%OUT%
- set AVS="%FNTMP%.avs"
- set FN=%NM%%OUT%
- set FNO=%NM%s%OUT%
- set ENC=--preset veryslow --tune grain --ref 4 --crf %CRF% --aq-mode 2 --merange 32 -o %TRKV%
- set ERRORLEVEL=
- rem Чистка временных папок/файлов от предыдущего некорректного завершения скрипта:
- call :cleanup
- echo.
- if not exist "%WDIR%" md "%WDIR%"
- rem Конвертация входящих файлов в MKV, если они не:
- if not exist "%~dp1%FN%" (
- %MKVM% -o "%~dp1%FN%" "%NMF%"
- echo ---
- echo "%NMF%" сконвертирован в "%FN%".
- )
- echo ---
- echo Извлечение дорожек...
- if %DVC%==DV1 (%MKVE% tracks "%~dp1%FN%" 1:%TRKA% 2:%TRKS%
- ) else (%MKVE% tracks "%~dp1%FN%" 1:%TRKA%
- )
- if ERRORLEVEL 1 goto badextr
- move "%~dp1%FN%" "%WRK%" >nul
- echo ---
- echo "%FN%" временно перемещён в
- echo "%WRK%".
- echo "%FN%" во время кодирования находится в "%WRK%">%TXT%
- rem Вычисление примерного времени кодирования и размера файла:
- call :frmchk "%WRK%"
- set/a EST=%FR%/%CPUFPS%/60
- set/a EFS=%FR%/30*%MBIT%/8
- echo ---
- echo Время старта: %date%, %time:~0,8%
- echo Ориентировочное время кодирования, минут: %EST%
- echo Ориентировочный размер итогового файла, МБайт: %EFS%
- echo Кодируем...
- echo Encode start: %date%, %time:~0,8%>%LOG%
- rem Выставление разных настроек AVS-файла в зависимости от устройства
- if %DVC%==DV1 goto dv1ff
- echo ffvideosource("%WRK%")>%AVS%
- set FRMCHKDONE=1
- goto enc
- :dv1ff
- echo ffvideosource("%WRK%",fpsnum=50)>%AVS%
- set FRMCHKDONE=0
- :enc
- if %x64%==1 goto x64enc
- %X264% %ENC% %AVS% 2>>%LOG%
- goto chkfps
- :x64enc
- %A2Y% %AVS% -o "-" | %X264% %ENC% "-" --demuxer y4m 2>>%LOG%
- :chkfps
- rem Проверка на кривой 50fps AVCHD-файл:
- if ERRORLEVEL 1 goto filebusy
- if %FRMCHKDONE%==1 goto merge
- set FR=0
- call :frmchk %TRKV%
- if %FR%==1 goto badframe
- goto merge
- :badframe
- echo ---
- echo Обнаружен нестандартный FPS
- echo (это может быть при разрезании исходного файла на части).
- echo Применяем режим совместимости (кодирование будет медленнее).
- if exist %TRKV% del %TRKV%
- echo ffvideosource("%WRK%",fpsnum=50,threads=1)>%AVS%
- set FRMCHKDONE=1
- goto enc
- :merge
- rem Мукс выдранных ранее дорожек аудио и субтитров в выходной видеофайл:
- echo Encode end: %date%, %time:~0,8%>>%LOG%
- move "%WRK%" "%~dp1%~nx1%" >nul
- set MRG=%MKVM% -q -o "%~dp1%FNO%" --default-language ru --language 0:ru --compression 0:none --no-chapters %TRKV% --language 0:ru --compression 0:none --no-chapters %TRKA% --language 0:ru --compression 0:none --no-chapters
- if %DVC%==DV1 (set MRG=%MRG% %TRKS%
- )
- %MRG%
- if not "%FNO%"=="%~n1s%OUT%" ren "%~dp1%FNO%" "%~n1s%OUT%"
- echo ---
- echo "%~n1s%OUT%" готов.
- echo Время окончания: %date%, %time:~0,8%
- call :cleanup
- set/a CNT=%CNT%+1
- goto shft
- :filebusy
- echo.
- echo ---
- echo Внимание! В процессе кодирования обнаружены ошибки,
- echo возможно файл занят другим процессом.
- echo "%~nx1" пропущен.
- move "%WRK%" "%~dp1%~nx1" >nul
- call :cleanup
- echo.
- goto shft
- :badextr
- echo.
- echo ---
- echo Внимание! В процессе извлечения дорожек обнаружены ошибки,
- echo "%~nx1" пропущен.
- goto shft
- :shft
- shift /1
- goto get
- :e
- echo ------------------------------------------------------------
- echo Все файлы обработаны.
- echo Перекодировано %CNT% файл(ов).
- if %CNT% GEQ 1 echo Файлы "*.log.txt" удалите вручную.
- echo.
- if exist "%WDIR%" rd /s /q "%WDIR%"
- if %SHUTPC%==0 pause & goto:eof
- set MSG="Все файлы обработаны. Чтобы отменить завершение работы нажмите 'y' в консольном окне пакетного файла."
- set VBS="%temp%\%~n1.$tmp$.vbs"
- chcp 1251 >nul
- echo MsgBox %MSG%,,"%~nx0">%VBS%
- chcp 866 >nul
- start "" /min %VBS%
- shutdown -s -t 60
- rem shutdown -h -t 60
- echo Нажмите "y" чтобы отменить завершение работы системы:
- :shut
- set /p SH=
- if not "%SH%"=="y" goto shut
- shutdown -a
- goto:eof
- :hlp
- set HF="%~dp0bin\hlpvid2small"
- set VB="%temp%\$%~n0-hlp$.vbs"
- if not exist %HF% echo Не задан входящий файл, выходим & pause & goto:eof
- chcp 1251 >nul
- echo MsgBox CreateObject("Scripting.FileSystemObject").OpenTextFile(%HF%).ReadAll,,"%~nx0">%VB%
- chcp 866 >nul
- %VB% & del %VB%
- goto:eof
- rem Процедуры:
- :inco
- echo ---
- echo %1
- echo не найден, выходим.
- pause
- exit/b
- :frmchk
- for /f "delims=" %%f in ('"%MI% --Inform=Video;%%FrameCount%% %1"') do set FR=%%f
- exit/b
- :cleanup
- if exist %TRKV% del %TRKV%
- if exist %TRKA% del %TRKA%
- if exist %TRKS% del %TRKS%
- if exist "%WRK%.ffindex" del "%WRK%.ffindex"
- if exist %AVS% del %AVS%
- if exist %TXT% del %TXT%
- exit/b
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement