Advertisement
muc-izhnet

video-PanasLX7_SamsA3_1080p2small.cmd

May 26th, 2016
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Winbatch 10.46 KB | None | 0 0
  1. @echo off
  2. rem Froz 09.03.2016
  3. rem Устройство #1 (Device 1) 'Panasonic LX7', исходник 1080p/50 MTS/MKV:
  4. rem // Высокое качество: CRF21: 11-17 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
  5. rem // Нормальное качество: CRF23: 8-11 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
  6. rem // Для архива: CRF26: ? Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
  7. rem // Дерганное видео с мелкими деталями: CRF28: 9-12 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
  8. set CRFDV1=23
  9. set MBITDV1=10
  10. rem Устройство #2 (Device 2) 'Samsung A3', исходник 1080p/30 MP4/MKV:
  11. rem // Для архива: CRF26: 4 Mbit; i3-2120 - 3 fps; C2D-6550 - 1 fps
  12. set CRFDV2=26
  13. set MBITDV2=5
  14. rem // SHUTPC: 1 = выключить компьютер после кодирования, 0 = не выключать
  15. set SHUTPC=0
  16. set CPUFPS=1
  17.  
  18. rem ------------------------------------------------------------
  19. rem Расширения входящих и исходящих файлов
  20. set IN1=.mts
  21. set IN2=.mp4
  22. set IN3=.mkv
  23. set SOUT=.sup
  24. set AUDV1=.ac3
  25. set AUDV2=.aac
  26. set OUT=%IN3%
  27. set CNT=0
  28. title %~nx0: уменьшение видеофайлов.
  29. if -%1==- goto hlp
  30. rem Проверка на наличие необходимых утилит:
  31. :chk
  32. if exist "%windir%\syswow64\avisynth.dll" goto x64chk
  33. if exist "%windir%\system32\avisynth.dll" goto x86chk
  34. echo ---
  35. echo AviSynth не найден, устанавливаем... Нужен пароль админа!
  36. "%~dp0bin\AviSynth_260.exe"
  37. goto chk
  38.  
  39. :x64chk
  40. rem Если Windows 64-bit:
  41. set x64=1
  42. set BF=%~dp0bin\x64
  43. set A2Y="%~dp0bin\avs2yuv.exe"
  44. if not exist %A2Y% call :inco %A2Y% & goto:eof
  45. set AVSPL=%programfiles(x86)%\AviSynth\plugins
  46. goto fchk
  47.  
  48. :x86chk
  49. rem Если Windows 32-bit:
  50. set x64=0
  51. set BF=%~dp0bin\x86
  52. set AVSPL=%programfiles%\AviSynth\plugins
  53. goto fchk
  54.  
  55. :fchk
  56. rem Продолжение проверки на наличие необходимых утилит:
  57. set X264="%BF%\x264.exe"
  58. set MKVE="%BF%\mkvextract.exe"
  59. set MKVM="%BF%\mkvmerge.exe"
  60. set MI="%BF%\mediainfo.exe"
  61. set FFA=FFMS2.avsi
  62. set FFD=ffms2.dll
  63. if not exist %X264% call :inco "%X264%" & goto:eof
  64. if not exist %MKVE% call :inco "%MKVE%" & goto:eof
  65. if not exist %MKVM% call :inco "%MKVM%" & goto:eof
  66. if not exist %MI% call :inco "%MI%" & goto:eof
  67. if not exist "%~dp0bin\%FFA%" call :inco "%~dp0bin\%FFA%" & goto:eof
  68. if not exist "%~dp0bin\%FFD%" call :inco "%~dp0bin\%FFD%" & goto:eof
  69. if not exist "%AVSPL%" goto oldavsy
  70. goto fchk2
  71. :oldavsy
  72. echo Похоже установлена старая версия AviSynth (папка "AviSynth 2.5").
  73. echo Нужно деинсталлировать старую версию штатным установщиком
  74. echo (чтобы удалилась папка "AviSynth 2.5") и перезапустить скрипт.
  75. call :inco "%AVSPL%"
  76. goto:eof
  77. :fchk2
  78. if not exist "%AVSPL%\%FFA%" copy /y "%~dp0bin\%FFA%" "%AVSPL%">nul
  79. if not exist "%AVSPL%\%FFD%" copy /y "%~dp0bin\%FFD%" "%AVSPL%">nul
  80. goto get
  81.  
  82.  
  83. :get
  84. rem Проверки на наличие и правильность входящего файла
  85. if -%1==- goto e
  86. if not exist %1 (
  87.   echo ---
  88.   echo "%~nx1" не найден, пропускаем.
  89.   goto shft
  90. )
  91. if /i not %~x1==%IN1% (
  92.   if /i not %~x1==%IN2% (
  93.     if /i not %~x1==%IN3% (  
  94.     echo ---
  95.     echo Расширение файла "%~nx1" не %IN1% / %IN2% / %IN3%, пропускаем.
  96.     goto shft
  97.     )
  98.   )
  99. )
  100. if exist "%~dp1%~n1s%OUT%" (
  101.   echo ---
  102.   echo "%~dp1%~n1s%OUT%" уже присутствует, "%~nx1" пропускаем.
  103.   goto shft
  104. )
  105. echo ------------------------------------------------------------
  106. echo Начата обработка "%~nx1"...
  107. set TXT="%~dp1%~n1.txt"
  108. set LOG="%~dp1%~n1s.log.txt"
  109.  
  110. rem Проверка на наличие в имени файла символов ')' и их временная замена на '_'
  111. set FNS=%~n1
  112. set NM=%FNS:)=_%
  113. set NMF=%NM%%~x1
  114. if not "%NMF%"=="%~nx1" (
  115.   ren "%~dp1%~nx1" "%NMF%"
  116.   echo ---
  117.   echo "%~nx1" временно переименован в "%NMF%".
  118.   goto :dvchk
  119. )
  120. set NM=%~n1
  121. set NMF=%~nx1
  122. :dvchk
  123. rem Проверка на FPS входящего файла (50 или 30) и переход к нужному конфигу девайса:
  124. for /f "delims=" %%f in ('"%MI% --Inform=Video;%%FrameRate%% "%~dp1%NMF%""') do set FRT=%%f
  125. if %FRT% LEQ 40 goto dvc2cfg
  126.  
  127. rem Конфиг устройства #1 (Device 1)
  128. set DVC=DV1
  129. set CRF=%CRFDV1%
  130. if %CRF% GTR 26 set MBIT=6 & goto sets
  131. if %CRF% LSS 21 set MBIT=15 & goto sets
  132. set MBIT=%MBITDV1%
  133. set AOUT=%AUDV1%
  134. goto sets
  135.  
  136. rem Конфиг устройства #2 (Device 2)
  137. :dvc2cfg
  138. set DVC=DV2
  139. set CRF=%CRFDV2%
  140. if %CRF% GTR 26 set MBIT=3 & goto sets
  141. if %CRF% LSS 23 set MBIT=11 & goto sets
  142. set MBIT=%MBITDV2%
  143. set AOUT=%AUDV2%
  144.  
  145. :sets
  146. rem Переменные для временных папок/файлов и энкодера:
  147. set WDIR=%~d1\$tmp$%~n0
  148. for %%f in ("%~dp1%NMF%") do set DT=%%~tf
  149. set FNTMP=%WDIR%\$tmp$%DT:~6,4%%DT:~3,2%%DT:~0,2%%DT:~11,2%%DT:~14,2%
  150. set TRKV="%FNTMP%_$video$%OUT%"
  151. set TRKA="%FNTMP%_$audio$%AOUT%"
  152. set TRKS="%FNTMP%_$subs$%SOUT%"
  153. set WRK=%FNTMP%%OUT%
  154. set AVS="%FNTMP%.avs"
  155. set FN=%NM%%OUT%
  156. set FNO=%NM%s%OUT%
  157. set ENC=--preset veryslow --tune grain --ref 4 --crf %CRF% --aq-mode 2 --merange 32 -o %TRKV%
  158. set ERRORLEVEL=
  159. rem Чистка временных папок/файлов от предыдущего некорректного завершения скрипта:
  160. call :cleanup
  161. echo.
  162. if not exist "%WDIR%" md "%WDIR%"
  163. rem Конвертация входящих файлов в MKV, если они не:
  164. if not exist "%~dp1%FN%" (
  165.    %MKVM% -o "%~dp1%FN%" "%NMF%"
  166.    echo ---
  167.    echo "%NMF%" сконвертирован в "%FN%".
  168. )
  169. echo ---
  170. echo Извлечение дорожек...
  171. if %DVC%==DV1 (%MKVE% tracks "%~dp1%FN%" 1:%TRKA% 2:%TRKS%
  172.   ) else (%MKVE% tracks "%~dp1%FN%" 1:%TRKA%
  173. )
  174. if ERRORLEVEL 1 goto badextr
  175. move "%~dp1%FN%" "%WRK%" >nul
  176. echo ---
  177. echo "%FN%" временно перемещён в
  178. echo "%WRK%".
  179. echo "%FN%" во время кодирования находится в "%WRK%">%TXT%
  180. rem Вычисление примерного времени кодирования и размера файла:
  181. call :frmchk "%WRK%"
  182. set/a EST=%FR%/%CPUFPS%/60
  183. set/a EFS=%FR%/30*%MBIT%/8
  184. echo ---
  185. echo Время старта: %date%, %time:~0,8%
  186. echo Ориентировочное время кодирования, минут: %EST%
  187. echo Ориентировочный размер итогового файла, МБайт: %EFS%
  188. echo Кодируем...
  189. echo Encode start: %date%, %time:~0,8%>%LOG%
  190. rem Выставление разных настроек AVS-файла в зависимости от устройства
  191. if %DVC%==DV1 goto dv1ff
  192. echo ffvideosource("%WRK%")>%AVS%
  193. set FRMCHKDONE=1
  194. goto enc
  195. :dv1ff
  196. echo ffvideosource("%WRK%",fpsnum=50)>%AVS%
  197. set FRMCHKDONE=0
  198.  
  199. :enc
  200. if %x64%==1 goto x64enc
  201. %X264% %ENC% %AVS% 2>>%LOG%
  202. goto chkfps
  203.  
  204. :x64enc
  205. %A2Y% %AVS% -o "-" | %X264% %ENC% "-" --demuxer y4m 2>>%LOG%
  206.  
  207. :chkfps
  208. rem Проверка на кривой 50fps AVCHD-файл:
  209. if ERRORLEVEL 1 goto filebusy
  210. if %FRMCHKDONE%==1 goto merge
  211. set FR=0
  212. call :frmchk %TRKV%
  213. if %FR%==1 goto badframe
  214. goto merge
  215.  
  216. :badframe
  217. echo ---
  218. echo Обнаружен нестандартный FPS
  219. echo (это может быть при разрезании исходного файла на части).
  220. echo Применяем режим совместимости (кодирование будет медленнее).
  221. if exist %TRKV% del %TRKV%
  222. echo ffvideosource("%WRK%",fpsnum=50,threads=1)>%AVS%
  223. set FRMCHKDONE=1
  224. goto enc
  225.  
  226. :merge
  227. rem Мукс выдранных ранее дорожек аудио и субтитров в выходной видеофайл:
  228. echo Encode end: %date%, %time:~0,8%>>%LOG%
  229. move "%WRK%" "%~dp1%~nx1%" >nul
  230. 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
  231. if %DVC%==DV1 (set MRG=%MRG% %TRKS%
  232. )
  233. %MRG%
  234. if not "%FNO%"=="%~n1s%OUT%" ren "%~dp1%FNO%" "%~n1s%OUT%"
  235. echo ---
  236. echo "%~n1s%OUT%" готов.
  237. echo Время окончания: %date%, %time:~0,8%
  238. call :cleanup
  239. set/a CNT=%CNT%+1
  240. goto shft
  241.  
  242. :filebusy
  243. echo.
  244. echo ---
  245. echo Внимание! В процессе кодирования обнаружены ошибки,
  246. echo возможно файл занят другим процессом.
  247. echo "%~nx1" пропущен.
  248. move "%WRK%" "%~dp1%~nx1" >nul
  249. call :cleanup
  250. echo.
  251. goto shft
  252.  
  253. :badextr
  254. echo.
  255. echo ---
  256. echo Внимание! В процессе извлечения дорожек обнаружены ошибки,
  257. echo "%~nx1" пропущен.
  258. goto shft
  259.  
  260. :shft
  261. shift /1
  262. goto get
  263.  
  264. :e
  265. echo ------------------------------------------------------------
  266. echo Все файлы обработаны.
  267. echo Перекодировано %CNT% файл(ов).
  268. if %CNT% GEQ 1 echo Файлы "*.log.txt" удалите вручную.
  269. echo.
  270. if exist "%WDIR%" rd /s /q "%WDIR%"
  271. if %SHUTPC%==0 pause & goto:eof
  272. set MSG="Все файлы обработаны. Чтобы отменить завершение работы нажмите 'y' в консольном окне пакетного файла."
  273. set VBS="%temp%\%~n1.$tmp$.vbs"
  274. chcp 1251 >nul
  275. echo MsgBox %MSG%,,"%~nx0">%VBS%
  276. chcp 866 >nul
  277. start "" /min %VBS%
  278. shutdown -s -t 60
  279. rem shutdown -h -t 60
  280. echo Нажмите "y" чтобы отменить завершение работы системы:
  281. :shut
  282. set /p SH=
  283. if not "%SH%"=="y" goto shut
  284. shutdown -a
  285. goto:eof
  286.  
  287. :hlp
  288. set HF="%~dp0bin\hlpvid2small"
  289. set VB="%temp%\$%~n0-hlp$.vbs"
  290. if not exist %HF% echo Не задан входящий файл, выходим & pause & goto:eof
  291. chcp 1251 >nul
  292. echo MsgBox CreateObject("Scripting.FileSystemObject").OpenTextFile(%HF%).ReadAll,,"%~nx0">%VB%
  293. chcp 866 >nul
  294. %VB% & del %VB%
  295. goto:eof
  296.  
  297. rem Процедуры:
  298. :inco
  299. echo ---
  300. echo %1
  301. echo не найден, выходим.
  302. pause
  303. exit/b
  304.  
  305. :frmchk
  306. for /f "delims=" %%f in ('"%MI% --Inform=Video;%%FrameCount%% %1"') do set FR=%%f
  307. exit/b
  308.  
  309. :cleanup
  310. if exist %TRKV% del %TRKV%
  311. if exist %TRKA% del %TRKA%
  312. if exist %TRKS% del %TRKS%
  313. if exist "%WRK%.ffindex" del "%WRK%.ffindex"
  314. if exist %AVS% del %AVS%
  315. if exist %TXT% del %TXT%
  316. exit/b
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement