[原创]命令行实现RMVB视频压制

[原创]命令行实现RMVB视频压制

09.3 修订
09.3.21更新
09.5.9更新v4.2a
09.5.17修订v4.3b
09.7.7修订v4.3c

20KB的NT命令脚本实现任意格式视频一键转换为RMVB

相关篇—— [原创]命令行实现MP3音频压制


 

频格式多种多样,格式互转的软件也多的不计其数。这篇文章讲述一种便捷的方法,在安装了合适的解码器以及Helix Real Producer(HRP)之后,使用一个16KB的Windows NT命令脚本既可以实现任意格式的视频文件拖放转换为RealVideo 9(RMVB)视频。

需求:
80MB磁盘空间(主要为安装解码器和Real Producer用);性能较好的CPU,比较大的内存(视频转换很消耗计算资源)

核心的工作原理:
在安装ffdshow解码器之后,各种主流视频格式都可以通过系统的解码组件解码,因此使用AVISynth提供视频流成为可能;Helix Real Producer可以直接读取的格式十分有限,许多常用格式无法正常打开,如AVI容器的XVID,还有MPEG2等等,但是可以打开avs,即AVISynth脚本文件。在自动生成avs脚本之后随即生成Real Producer的任务文件(.rpjf,Real Producer Job File),调用命令行编码器producer.exe进行编码。

设计效果:
在做好前期准备以后,任何时刻转换视频只需要使用一个文件:gen_core.cmd。可以通过三种方式启动:一,拖动欲转换视频的图标,放到gen_core.cmd上面,立即启动转换;二,通过命令行启动,类似于拖放;三,通过命令行启动,没有任何等待,错误信息记录在磁盘文件中,即实现无人值守的批处理压制。另外,如果直接双击启动脚本,又有三个功能:生成引用d2v的avs,打开编辑脚本(自动备份),以及显示版本信息。

流程大致分如下几步:
一,环境变量初始化,设置调用的文件位置、视频属性等;
二,检查输入是否有误:文件名应为扩展到驱动器的完整路径名,目的文件夹中应不包含同名的RMVB文件,在批处理环境下每个调用语句只允许一个文件,拖拽启动时同时拖拽的文件应不多于五十个;
三,检查无错后,进行avs和rpjf脚本的编译。如果输入文件为avs脚本,则直接引用。
四,启动producer。
五,压制结束,删除临时文件。

前期准备——安装AVISynth,ffdshow,和Helix Producer:
一,AVISynth,这个提供从媒体文件到压制软件的传输通道。使用版本2.57。安装完以后,需要自行安装着几个滤镜(如果你需要使用DVD转RMVB的功能):nicaudio,dgmpgdec,kerneldeint,mpasource(安装方法:下载到的压缩包解压后,把所有文件复制到avisynth安装目录的plugins文件夹中即可,注意不要建立子文件夹)。
二,ffdshow,这个是一步到位的解码器,可以打开绝大多数主流媒体文件。使用版本ffdshow-rev1900_20080315_xxl

AVISynth和滤镜以及ffdshow的下载:

http://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/Avisynth|_257.rarhttp://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/dgmpgdec148|_20060720.ziphttp://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/kerneldeint141.ziphttp://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/mpasource|_20080220.ziphttp://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/nicaudio|_20070821.ziphttp://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/ffdshow-rev1900|_20080315|_xxl.rar

三,Helix Real Producer,这个是Real公司出的压制工具,一切事情的起点……使用版本RealProducer Plus 11,其实具体版本无所谓,我们只用到RealVideo9,这样速度比较快。

声明:
这里使用到的三个软件,其中AVISynth(包括那些第三方滤镜)和ffdshow都是免费开源软件,只要是在不谋取商业利益的前提下,你可以对它们做任何事情。而Helix Producer是商业软件,也就是说你需要花钱购买。当然网上可以下载到安装程序,但请不要找我要序列号,这样没意思:)


 

后期准备——初始化gen_core.cmd:

gen_core.cmd下载:

http://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/gen|_core|_43c.rar

或者把下面代码保存成文本文件,再更改扩展名为cmd:

***

@echo off
setlocal EnableDelayedExpansion

::*****************initialization
set MEDIATARGET=F:exchangevideo
set PRODUCER="D:movieRealRealPRODUCER Plus 11PRODUCER.exe"
set coreversion=gen_core 4.3c    code last updated ^: 2009-6-26 16^:32
set D2AVSversion=AVS generator for D2V files v0.2    code last updated ^: 2009-4-30 23^:13
set resize=1
set redar=1
set DAR_H=3
set DAR_W=4
set SIZE_H=240
set SIZE_W=320
set RM_AVGBITRATE=350000
set RM_MAXBITRATE=700000
set RM_MAXFRAMERATE=24
set RM_QUALITY=60
set RemainAVSfile=0
set silent=n
set quenum=0

:: just for fun!
title %coreversion%
color 0e
mode con lines=100

:: generate time and date string.
for /f "tokens=1-3 delims=/- " %%a in (‘date /t’) do set "gendatetime=%%a%%b%%c"
for /f "tokens=1-3 delims=:." %%a in (‘echo %time%’) do set "gendatetime=%gendatetime%%%a%%b%%c"

::check

call :chkifrun

if "%~1"=="" goto :chsfunc

if /i "%~1"=="-b" (
set silent=s
if not "%~3"=="" call :terminate 03 !silent!
shift
)

if /i "%~x1"==".txt" (
call :filelstb "%~1"
goto :end
)

if /i "%~x1"==".d2v" (
echo Input file is a D2V file, generate avs for it automatically.
call :d2v_gen "%~n1" "%~dp1"
goto :end
)

if not "%~1"=="%~dp1%~nx1" (
call :terminate 01 "%~1" %silent%
goto :end
)

::generate task queue

  set i=1
  :qprocess
   set "que!i!=%~1"
   set "qun!i!=%~n1"
   shift
   set /a quenum+=1
   if %quenum% GTR 50 (echo too many files – "!que%i%!" && pause>nul && endlocal && exit /b)
   set /a i+=1

  if "%~1" NEQ "" goto :qprocess

::head of batch

:begin
cls

set current=!que%quenum%!
set currentn=!qun%quenum%!
set currentn=%currentn:(=[%
set currentn=%currentn:)=]%

if exist "%MEDIATARGET%%currentn%.rmvb" (
call :terminate 02 "%currentn%" %silent%
goto :end
)

::print queue list

  echo Task Queue list ^: && echo.
  for /l %%i in (1,1,%quenum%) do echo !que%%i!
  echo ——————————————————
  echo.

::composing job file

echo.
echo gen_core started^: %time:~,8% && echo %coreversion% && echo.
echo Source file is && echo %current% && echo.

call :compavs "%current%" "%MEDIATARGET%temp.avs"
call :comprpjf "%MEDIATARGET%temp.rpjf" "%MEDIATARGET%temp.avs" "%MEDIATARGET%temp.rmvb"
attrib "%MEDIATARGET%temp.rpjf" +h
attrib "%MEDIATARGET%temp.avs" +h
echo job file finished.

::start producer.exe and check error after coding

echo.&&echo Process references –
if %resize%==1 (echo Resize to %SIZE_W%x%SIZE_H% using Lanczos.) else (echo Do not Resize.)
if %redar%==1 (echo Change DAR to %DAR_W%^:%DAR_H% by adding borders.) else (echo Do not change DAR.)
echo Bitrate^: %RM_AVGBITRATE:~,3% ^(Average^) , %RM_MAXBITRATE:~,3% ^(Max^) ,   Framerate^: %RM_MAXFRAMERATE% ,   Video Quality^: %RM_QUALITY%%% .

echo.&&echo starting producer…

%PRODUCER% -j "%MEDIATARGET%temp.rpjf" -daw

if ERRORLEVEL 1 (
echo.&&echo.&&echo.
echo An error has occured during the PRODUCER step.
echo Check your media file, it may be corrupt.
pause>nul
attrib "%MEDIATARGET%temp.avs" -h
del "%MEDIATARGET%temp.rpjf" /ah
goto :directly_end
)

::end of batch

echo.&&echo processing work complete.
echo Cleaning any temporary file generated by this batch….

if "%RemainAVSfile%"=="0" (del "%MEDIATARGET%temp.avs" /ah) else (attrib "%MEDIATARGET%temp.avs" -h && ren "%MEDIATARGET%temp.avs" "%currentn%.avs%")
del "%MEDIATARGET%temp.rpjf" /ah
ren "%MEDIATARGET%temp.rmvb" "%currentn%.rmvb"

call :timewait 3

:end
if %quenum% GTR 1 (
set /a quenum-=1
goto :begin
)

:: the following line is for compatibility of error-checking in PRODUCER step.
:directly_end

endlocal
exit /b

:: ***************sub commands**************************************************************

::compose avs file
:: usage – call :compavs ["%~1"] [target avs file | "%MEDIATARGET%temp.avs"]

:compavs

echo start parsing job file..

:: the follow IF structure is for compatibility with D2V generator.

set AvsIncludeFile=%1
set AvsIncludeFile=%AvsIncludeFile:"=%

if "%AvsIncludeFile%" NEQ "NULL" (
  >%2 echo # automatically generated by gen_core
  >>%2 echo DirectShowSource^("%AvsIncludeFile%"^,fps=%RM_MAXFRAMERATE%,convertfps=true^)
)

if /i "%AvsIncludeFile:~-12%"=="d2v_temp.avs" (
  echo Input file is d2v script, quote it.
  >>%2 echo Import^("%AvsIncludeFile%"^)
  goto :rere
)

if /i "%AvsIncludeFile:~-4%"==".avs" (
  echo Input file is a script, Directly quote it.
  >>%2 echo Import^("%AvsIncludeFile%"^)
goto :eof
)

:rere
if %redar%==0 goto :resize

:redar
>>%2 echo oH=Height
>>%2 echo oW=Width
>>%2 echo H=oH+^(^(oH%%%DAR_H%==0^)?0:^(%DAR_H%-oH%%%DAR_H%)^)
>>%2 echo W=oW+^(^(oW%%%DAR_W%==0^)?0:^(%DAR_W%-oW%%%DAR_W%)^)
>>%2 echo cT=^(W*%DAR_H%^<H*%DAR_W%^)?0:^(W*%DAR_H%/%DAR_W%-H^)/2
>>%2 echo cB=^(W*%DAR_H%^<H*%DAR_W%^)?0:^( int^(^(W*%DAR_H%/%DAR_W%-H^)/2^)*2==^(W*%DAR_H%/%DAR_W%-H^)?^(^(W*%DAR_H%/%DAR_W%-H^)/2^):^(W*%DAR_H%/%DAR_W%-H^)/2+1 ^)
>>%2 echo cR=^(W*%DAR_H%^<H*%DAR_W%^)?^(^(H*%DAR_W%/%DAR_H%-W^)/2^):0
>>%2 echo cL=^(W*%DAR_H%^<H*%DAR_W%^)?^(^(H*%DAR_W%/%DAR_H%-W^)/2^):0
>>%2 echo AddBorders ^( int ^(cL^)^, int ^(cT^)^, int ^(cR^)^, int ^(cB^) ^)

:resize

if %resize%==0 goto :noresize

>>%2 echo LanczosResize ^(%SIZE_W%^,%SIZE_H%^)

:noresize

::add subtitle

if exist "%AvsIncludeFile:~0,-4%.sub" (
  echo Subtitle file "%AvsIncludeFile:~0,-4%.sub" detected^, loaded automatically.
  >>%2 echo VobSub^("%AvsIncludeFile:~0,-4%.sub"^)
)
if exist "%AvsIncludeFile:~0,-4%.srt" (
  echo Subtitle file "%AvsIncludeFile:~0,-4%.srt" detected^, loaded automatically.
  >>%2 echo TextSub^("%AvsIncludeFile:~0,-4%.srt"^)
)

>>%2 echo ConvertToYV12

goto :eof

::compose PRODUCER job rpjf file
:: usage – call :comprpjf [target rpjf file | "%MEDIATARGET%temp.rpjf"] [.avs file name | %MEDIATARGET%temp.avs] [.rpjf file name | %MEDIATARGET%temp.rmvb]

:comprpjf

set comrpjf_rpjf=%2
set comrpjf_rpjf=%comrpjf_rpjf:"=%
set comrpjf_rmvb=%3
set comrpjf_rmvb=%comrpjf_rmvb:"=%

>%1 echo ^<?xml version="1.0" encoding="UTF-8"?^>
>>%1 echo ^<job xmlns="
http://ns.real.com/tools/job.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://ns.real.com/tools/job.2.0 http://ns.real.com/tools/job.2.0.xsd"^>
>>%1 echo   ^<enableTwoPass type="bool"^>false^</enableTwoPass^>
>>%1 echo   ^<clipInfo^>
>>%1 echo     ^<entry^>
>>%1 echo       ^<name^>Author^</name^>
>>%1 echo       ^<value type="string"^>dtm^</value^>
>>%1 echo     ^</entry^>
>>%1 echo     ^<entry^>
>>%1 echo       ^<name^>Copyright^</name^>
>>%1 echo       ^<value type="string"^>Scorp^</value^>
>>%1 echo     ^</entry^>
>>%1 echo     ^<entry^>
>>%1 echo       ^<name^>Generated By^</name^>
>>%1 echo       ^<value type="string"^>RealPRODUCER(R) Plus 11.0 for Windows, Build 11.0.0.2013^</value^>
>>%1 echo     ^</entry^>
>>%1 echo   ^</clipInfo^>
>>%1 echo   ^<inputs^>
>>%1 echo     ^<input xsi:type="avFileInput"^>
>>%1 echo       ^<filename type="string"^>%comrpjf_rpjf%^</filename^>
>>%1 echo       ^<prefilters^>
>>%1 echo         ^<prefilter xsi:type="deinterlacePrefilter"^>
>>%1 echo           ^<deinterlace type="bool"^>true^</deinterlace^>
>>%1 echo           ^<enabled type="bool"^>true^</enabled^>
>>%1 echo           ^<inverseTelecine type="bool"^>true^</inverseTelecine^>
>>%1 echo           ^<manual type="bool"^>false^</manual^>
>>%1 echo           ^<pluginName type="string"^>rn-prefilter-deinterlace^</pluginName^>
>>%1 echo         ^</prefilter^>
>>%1 echo         ^<prefilter xsi:type="audioGainPrefilter"^>
>>%1 echo           ^<enabled type="bool"^>false^</enabled^>
>>%1 echo           ^<gain type="double"^>0.000000^</gain^>
>>%1 echo         ^</prefilter^>
>>%1 echo       ^</prefilters^>
>>%1 echo     ^</input^>
>>%1 echo   ^</inputs^>
>>%1 echo   ^<parOutputs^>
>>%1 echo     ^<output^>
>>%1 echo       ^<destinations^>
>>%1 echo         ^<destination xsi:type="fileDestination"^>
>>%1 echo           ^<filename type="string"^>%comrpjf_rmvb%^</filename^>
>>%1 echo         ^</destination^>
>>%1 echo       ^</destinations^>
>>%1 echo       ^<mediaProfile^>
>>%1 echo         ^<audioMode type="string"^>music^</audioMode^>
>>%1 echo         ^<audioResamplingQuality type="string"^>high^</audioResamplingQuality^>
>>%1 echo         ^<disableAudio type="bool"^>false^</disableAudio^>
>>%1 echo         ^<disableVideo type="bool"^>false^</disableVideo^>
>>%1 echo         ^<outputHeight type="uint"^>0^</outputHeight^>
>>%1 echo         ^<outputWidth type="uint"^>0^</outputWidth^>
>>%1 echo         ^<resizeQuality type="string"^>high^</resizeQuality^>
>>%1 echo         ^<videoMode type="string"^>normal^</videoMode^>
>>%1 echo         ^<audienceRefs^>
>>%1 echo           ^<audienceRef^>for oppo^</audienceRef^>
>>%1 echo         ^</audienceRefs^>
>>%1 echo       ^</mediaProfile^>
>>%1 echo     ^</output^>
>>%1 echo   ^</parOutputs^>
>>%1 echo   ^<audiences^>
>>%1 echo     ^<audience^>
>>%1 echo       ^<avgBitrate type="uint"^>%RM_AVGBITRATE%^</avgBitrate^>
>>%1 echo       ^<maxBitrate type="uint"^>%RM_MAXBITRATE%^</maxBitrate^>
>>%1 echo       ^<name type="string"^>for oppo^</name^>
>>%1 echo       ^<streams^>
>>%1 echo         ^<stream xsi:type="videoStream"^>
>>%1 echo           ^<codecName type="string"^>rv10^</codecName^>
>>%1 echo           ^<enableLossProtection type="bool"^>true^</enableLossProtection^>
>>%1 echo           ^<encodingComplexity type="string"^>high^</encodingComplexity^>
>>%1 echo           ^<encodingType type="string"^>vbrBitrate^</encodingType^>
>>%1 echo           ^<maxFrameRate type="double"^>%RM_MAXFRAMERATE%.000000^</maxFrameRate^>
>>%1 echo           ^<maxKeyFrameInterval type="double"^>3.000000^</maxKeyFrameInterval^>
>>%1 echo           ^<maxStartupLatency type="double"^>2.000000^</maxStartupLatency^>
>>%1 echo           ^<pluginName type="string"^>rn-videocodec-realvideo^</pluginName^>
>>%1 echo           ^<quality type="uint"^>%RM_QUALITY%^</quality^>
>>%1 echo         ^</stream^>
>>%1 echo         ^<stream xsi:type="audioStream"^>
>>%1 echo           ^<codecFlavor type="uint"^>1^</codecFlavor^>
>>%1 echo           ^<codecName type="string"^>raac^</codecName^>
>>%1 echo           ^<encodingComplexity type="string"^>high^</encodingComplexity^>
>>%1 echo           ^<pluginName type="string"^>rn-audiocodec-realaudio^</pluginName^>
>>%1 echo           ^<streamContext type="bag"^>
>>%1 echo             ^<audioMode type="string"^>voice^</audioMode^>
>>%1 echo             ^<presentationType type="string"^>audio-video^</presentationType^>
>>%1 echo           ^</streamContext^>
>>%1 echo         ^</stream^>
>>%1 echo         ^<stream xsi:type="audioStream"^>
>>%1 echo           ^<codecFlavor type="uint"^>1^</codecFlavor^>
>>%1 echo           ^<codecName type="string"^>raac^</codecName^>
>>%1 echo           ^<encodingComplexity type="string"^>high^</encodingComplexity^>
>>%1 echo           ^<pluginName type="string"^>rn-audiocodec-realaudio^</pluginName^>
>>%1 echo           ^<streamContext type="bag"^>
>>%1 echo             ^<audioMode type="string"^>music^</audioMode^>
>>%1 echo             ^<presentationType type="string"^>audio-video^</presentationType^>
>>%1 echo           ^</streamContext^>
>>%1 echo         ^</stream^>
>>%1 echo         ^<stream xsi:type="audioStream"^>
>>%1 echo           ^<codecFlavor type="uint"^>9^</codecFlavor^>
>>%1 echo           ^<codecName type="string"^>raac^</codecName^>
>>%1 echo           ^<encodingComplexity type="string"^>high^</encodingComplexity^>
>>%1 echo           ^<pluginName type="string"^>rn-audiocodec-realaudio^</pluginName^>
>>%1 echo           ^<streamContext type="bag"^>
>>%1 echo             ^<audioMode type="string"^>voice^</audioMode^>
>>%1 echo             ^<presentationType type="string"^>audio-only^</presentationType^>
>>%1 echo           ^</streamContext^>
>>%1 echo         ^</stream^>
>>%1 echo         ^<stream xsi:type="audioStream"^>
>>%1 echo           ^<codecFlavor type="uint"^>11^</codecFlavor^>
>>%1 echo           ^<codecName type="string"^>raac^</codecName^>
>>%1 echo           ^<encodingComplexity type="string"^>high^</encodingComplexity^>
>>%1 echo           ^<pluginName type="string"^>rn-audiocodec-realaudio^</pluginName^>
>>%1 echo           ^<streamContext type="bag"^>
>>%1 echo             ^<audioMode type="string"^>music^</audioMode^>
>>%1 echo             ^<presentationType type="string"^>audio-only^</presentationType^>
>>%1 echo           ^</streamContext^>
>>%1 echo         ^</stream^>
>>%1 echo       ^</streams^>
>>%1 echo     ^</audience^>
>>%1 echo   ^</audiences^>
>>%1 echo ^</job^>

goto :eof

::print error or help info
:: usage – call :teminate [errorcode] [type char "s" for silent batch]
:: error code –
:: 00 about this batch file
:: 01 not full path
:: 02 target file already existing
:: 03 too many strings in batch mode

:terminate

set erroroutputfile=%MEDIATARGET%error.log
set corruptedfilename=%2
set corruptedfilename=%corruptedfilename:"=%

if %1==01 (
set errorinfo=bad file name "%corruptedfilename%" – MUST FULL path
)

if %1==02 (
set errorinfo=file "%corruptedfilename%" already existing in target folder – %MEDIATARGET%
)

if %1==03 (
set errorinfo=too many strings^^^! only "-b" is supported.
)

cls
if /i "%3"=="s" (
echo %errorinfo%
echo %errorinfo%>>%MEDIATARGET%error.log
echo an error has occured and this window will be closed after 5 seconds…
call :timewait 5
) else (
echo %errorinfo%
pause>nul
echo.
echo *** about this batch file… ***
echo.
echo this is a batch file devoted to processing media file.
echo  it can convert a video file in any regular format to RV10 VBR file.
echo  i develop it in order to replay videos on OPPO S9.
echo gen_core uses these modules –
echo  AVISynthezier,
echo  Helix Real PRODUCER ^(or its codecs, registered to system environment^),
echo  ffdshow ^(or any other DirectShow loadable decoders^),
echo  and last and most important a WinXP environment!
echo.
echo If Subtitle file of which the name same as the input file,
echo  it will be loaded automatically.
echo  to disable the subtitle, rename the sub different ^(so they are not the same^).
echo.
echo DO NOT DO ANYTHING ILLEGAL !!!
echo %coreversion%
echo.
echo how to use – simply DRAG video file to gen_core icon — max 8 files
echo command line format – gen_core FILENAME^(MUST FULL path^)
echo batch script integration –
echo  add command CALL before gen_core and string -b after it, sample^:
echo  call gen_core -b "F:exchangevideoBrokeBackMountain2.avi"
pause>nul
)

goto :eof

::generate txt-format file list
:: usage – call :filelstb "%~1"

:filelstb

echo Is it a file list^? Automatically read it..
echo.
for /F "usebackq tokens=*" %%i in (%1) do (
  >>"%MEDIATARGET%batch%gendatetime%.cmd" echo call gen_core -b %%i
)
echo batch run script generated –
echo "%MEDIATARGET%batch%gendatetime%.cmd"
echo please run this by yourself!
echo.
pause>nul

goto :end

::wait for some time
:: usage – call :timewait [sec]

:timewait
>nul ping 127.0 -n %1

goto :eof

::print feature table if gen_core is run after double click

:chsfunc
set extendedfeature=NULL
:chsfunc1
echo gen_core running after double clicked ^:^)
echo features – && echo.
echo AD     Make an AVS file for DGIndex^(.d2v file^)
echo CFG    Edit gen_core.cmd
echo LST    generate file list
echo.

if not "%extendedfeature%"=="NULL" echo invalid input^^!
call :getinput extendedfeature What_do_you_want^?

if /i "%extendedfeature%"=="lst" (
  echo.
  call :getinput directory drag_your_target_here
  set directory=!directory:"=!

  pushd "!directory!"
  for /r %%f in (*) do (
   echo "%%~dpnxf">>"%MEDIATARGET%filelist%gendatetime%.txt"
   echo %%~dpnxf
  )
  popd

  echo.
  echo Now file list generated^:
  echo %MEDIATARGET%filelist%gendatetime%.txt
  pause>nul

  endlocal
exit
)

if /i "%extendedfeature%"=="cfg" (
  >nul del "%~dpn0.bak" /ahr
  >nul copy "%~0" "%~dpn0.bak" /y
  >nul attrib "%~dpn0.bak" +h +r
  echo automatically backuped.
  call :timewait 2
  start notepad gen_core.cmd
  endlocal
exit
)

if /i "%extendedfeature%"=="ad" (
  call :d2v_help
  endlocal
exit
)

cls
goto :chsfunc1

::get input
:: usage – call :getinput [target variable]

:getinput
set getinput_temp=
set getinput_question=%2
set /p getinput_temp=%getinput_question:_= %   
if not defined getinput_temp goto :getinput
set %1=%getinput_temp%

goto :eof

::Check if gen_core is working.
:: usage – call :chkifrun

:chkifrun

if exist "%MEDIATARGET%temp.avs" (
  echo File temp.avs exists in target folder^!
  echo Perhaps another batch of gen_core is working right now.
  pause>nul
  endlocal
  exit
) else goto :eof

::D2V AVS file generator

:d2v_help

cls&&echo.&&echo %D2AVSversion%&&echo.
echo D2V to AVS module has now been upgraded to a semi-manual funciton.
echo It provides a simple solution, allowing you generate an AVS script
echo with ONLY A DRAG.
echo.
echo How to use –
echo.
echo 1. First generate a d2v file with DGIndex.
echo.
echo 2. Then use DGIndex to DEMUX Audio.
echo    note^: currently supported audio formats –
echo           .WAV ^(LPCM^) .MPA ^(MPEG2^) .AC3 ^(Dolby^)
echo.
echo 3. Rename the audio file. The name should be same as .D2V file.
echo    e.g. VTS_**_*.WAV
echo.
echo 4. Ensure there’s THREE neccessary files in the same folder –
echo    VTS_**_*.VOB ^(DVD Video Object^)
echo    VTS_**_*.D2V and VTS_**_*.***^(Audio file, ext. name differs^)
echo    ^(the two above are automatically generated by DGIndex during Step 1. and 2.^)
echo.
echo 5. Enjoy^^! DRAG D2V file onto gen_core^^!
echo.&&echo.
pause>nul
goto :eof

:d2v_gen

:: usage – call :d2v_gen [incoming d2v filename WITH QUOTES e.g. "%~n1"] [folder which stores vob d2v and audio WITH QUOTES e.g. "%~dp1"]

:: buffer parameters

set "d2vfile=%1"
set "d2vfile=%d2vfile:"=%"
set "d2vfolder=%2"
set "d2vfolder=%d2vfolder:"=%"

:: find audio files

if exist "%d2vfolder%%d2vfile%.wav" (
  set audpref=WAVSource
  set "audplugin="
  set "audfile=%d2vfile%.wav"
) else (
  if exist "%d2vfolder%%d2vfile%.mpa" (
   set audpref=MPASource
   set "mpaaud=^,normalize^=false"
   set "audfile=%d2vfile%.mpa"
  ) else (
   if exist "%d2vfolder%%d2vfile%.ac3" (
    set audpref=NicAC3Source
    set "audfile=%d2vfile%.ac3"
)))

:: generate AVS scripts

if exist "%MEDIATARGET%D2V_%d2vfile%.avs" (
  call :terminate 02 "%~1" %silent%
  goto :eof
)
>"%MEDIATARGET%D2V_%d2vfile%.avs" echo # automatically generated by gen_core
if defined audpref (
echo Audio file detected. Automatically load it…
echo.
>>"%MEDIATARGET%D2V_%d2vfile%.avs" echo AudioDub^(mpeg2source^(^"%d2vfolder%%d2vfile:"=%.d2v^"^)^,%audpref%^(^"%d2vfolder%%audfile:"=%^"%mpaaud%^)^)
) else (
echo Audio file NOT detected.
echo If you want to load audio automatically please NAME it same as d2v file^^!
echo.
>>"%MEDIATARGET%D2V_%d2vfile%.avs" echo mpeg2source^(%d2vfile%^)
)
>>"%MEDIATARGET%D2V_%d2vfile%.avs" echo KernelDeint^(1^)
>>"%MEDIATARGET%D2V_%d2vfile%.avs" echo ChangeFPS^(24^, 1^)
>>"%MEDIATARGET%D2V_%d2vfile%.avs" echo SSRC^(44100^)

:: add crop into script
call :compavs NULL "%MEDIATARGET%D2V_%d2vfile%.avs"

echo AVS file completed – "%MEDIATARGET%D2V_%d2vfile%.avs"
echo.
if %silent% NEQ s pause>nul

goto :eof

 

***

用记事本打开gen_core.cmd(方法:右键选“编辑”或在记事本中选择菜单项“文件〉打开”)。接下来要进行一些必要的设置。

首先请对记事本做一些设置:打开“格式”菜单,去掉“自动换行”前面的钩;再打开“查看”菜单,选上“状态栏”前面的钩,这样你可以在记事本窗口的最下面看到光标所在的行号Ln和列号Col。

一,设置producer的安装目录。
位于第六行(Ln 6,下略),需要修改的是等号后面的字符串。一般是"C:Program FilesRealRealProducer Plus 11producer.exe",反正就是包含producer.exe的那个目录,你自己装在那儿就写上去,注意用英文双引号括起来。

二,设置临时文件和生成rmvb文件的存放目录。
在第五行。需要修改的是等号后面的字符串。这个目录需要你自己指定,它是用来存放自动生成的两个脚本文件,和压制生成的rmvb文件的,我推荐你在一个大的分区里新建一个文件夹。
注意两点,一,完整的文件名不能包含中文、标点符号以及其他一切特殊字符,最好也不要带空格,这样做是因为producer不支持空格和全角字符,如果你用了汉字之类的东西的话producer在运行时会报错(非法操作);二,路经要从驱动器开始,写完整,最后加上个反斜杠“”,比如G:exchangevideo。

三,设置缩放尺寸和更改比例(加黑框)。
这个问题,因为我写这个gen_core主要是为了在OPPO S9上看RMVB,而一般的片子要么图像太大,打开慢,要么压制的有问题,经常出错,所以想自己压制320×240的RMVB视频。加之最新版的固件(Firmware)有个bug,就是在播放纵横比不是4:3的视频时把画面充满整个屏幕,因此缩放、加框这两个操作就有必要。
缩放容易理解,而关于加框是这样的,比如你有个视频,画面是16:9的,分辨率1280×720,如果缩放成MP4的屏幕的分辨率,也就是320×240,必然会把画面拉长(你可以用“画图”做个试验),如何解决这个问题,我的想法是在原有的视频周围自动加上黑色的边框,比如在这个例子里,如果上下加上120像素的边框,这样画面分辨率就是1280×960,再缩放成320×240就不会有比例失真了。
下面说说脚本里是怎样设置的,是第九到第十四行共六个变量控制的。其中:resize=1表示启用画面缩放,0禁用;redar=1表示启用自动加框,0禁用;DAR_H和DAR_W是一组,表示高与宽的比例(比如DAR_H=3和DAR_W=4表示宽:高=4:3);SIZE_H与SIZE_W是一组,表示缩放后的画面大小(比如SIZE_H=240和SIZE_W=320表示宽x高=320×240)。
注意:缩放和加框可以独立执行,两者互不干扰;四个数值必须为整数,否则AVISynth报错,压制时非法操作;其他相关信息请自行获取。


 

准备完成之后,你就可以尝试压制视频了——

第一种方式:直接拖拽。把视频文件的图标拖动到gen_core.cmd的图标上,这有点像你在把文件放到文件夹里的时候,把文件的图标拖动到文件夹的图标上的操作。每次拖动最多支持五十个文件,多了报错。所有你需要做的就是这么简单,拖动!

第二种方式:命令行启动。也简单得很,输入命令行gen_core加上一个空格,再加上视频文件的完整路径(用英文双引号括起来)即可,比如:
gen_core "G:exchangevideoBrokeBackMountain2.avi"

第三种方式:批处理脚本启动。要在gen_core之前加call命令,之后加参数-b,示例:
call gen_core -b "G:exchangevideoBrokeBackMountain2.avi"
这样将禁用所有报错显示,错误信息输出存放在文本文件err.txt中,也就是“缄默模式(silent mode)”,你可以写另一个脚本,里面包含许多个call,保存后双击运行就不用再管了,gen_core会处理完所有的文件!

第四种方式:双击启动。这样不能压制视频,而是三个功能:显示版本和简易的帮助提示、自动备份脚本后打开记事本编辑脚本、生成DVD转RMVB用到的avs文件。对第三点多说几句:众所周知,DVD视频转换成其它格式挺麻烦(真的挺麻烦),我的方法是用DGIndex生成d2v文件,同时解出音轨(一般是ac3文件),这样以后就可以用avs加载了,这里是一个自动生成器,依次把d2v文件、音频文件拖放到CMD窗口并回车,就能自动生成加载d2v文件的avs脚本。

关于版本:
现在贴的是3.53,其实我勤的话三天两头就改写一次代码,到现在总算是稳定了,没再有太大的改动。不过一个小功能d2v脚本生成器还处于尝试阶段(0.1),虽然能用但是不保证质量。

关于速度:
我的笔记本是Dell Vostro 1400,T8100,1G内存,转换视频大概是3-4倍的速度,也就是一秒钟处理四秒钟视频数据。还算比较快的`比好多转换软件要快吧,因为这里用的是avs脚本,在脚本阶段对画面进行处理,速度是比较快的,比用producer进行缩放等操作要快。

09.3 添加内容:
关于在producer编码阶段异常跳出的问题,还有声音不正常(没有声音、速率不对等等),大致可以归咎于解码器没有安装好。要解决这个问题,首先检查ffdshow是否安装好,如果在安装ffdshow之后又安装了其他的解码器(比如安装Adobe套件的时候就不知不觉装了,害得我一个晚上压的视频全都是半倍速声音),建议重新安装之。如果问题尚未解决,应该配置ffdshow,将它设置为相应视频/音频格式的首选的解码器,在ffdshow自带的设置界面里可以找到。如果问题仍然没有解决,建议尝试安装独立的解码器(应该是官方提供的或者有一定资质的来源)。


 

09.3.21 更新至4.0 beta – 采用子程序调用,优化程序结构,文件尺寸长了1KB。

09.5.9  更新至4.2a – 主要是加入了三个功能:自动生成文件列表,以及将文件列表转化成批处理文件;DVD影片半自动转换RMVB;视频参数的设置

1    文件列表 – 自动生成文件列表、文件列表转换成批处理列表

效果:第一次运行,通过拖动文件夹的图标,生成该文件夹的文件列表(文本文档)。
       第二次运行,通过拖动文件列表,生成call gen_core -b的批处理(参考上面的“第三种方式”)。

使用方法
Step 1. 自动生成文件列表。双击gen_core,按提示输入LST后回车,再按提示,把欲生成文件列表的文件夹图标,直接拖动到命令行窗口中,若成功则显示该目录的路径。然后按回车,自动生成文件列表,格式为文本文档(TXT)。
Step 2. 修剪文件列表,把不需要的文件剔除。
Step 3. 把文件列表文件的图标,直接拖动到gen_core上面(就像处理视频文件一样),gen_core自动生成对应的命令行调用批处理,直接运行即可。

2    DVD功能 – 半自动转DVD至RMVB

简介
gen_core集成了D2AVS子命令,即AVS generator for D2V files,在核心版本升级至4.0的同时,D2AVS升级到了0.2版,实现了半自动、半手工的DVD-RMVB转换。
一直在思考要不要做成全自动,但是考虑到DVD影片的变化太多,一种设置不能达到最好的效果,所以一部分步骤并没有自动化,用户自己来做,虽然麻烦,但是灵活性更高。

效果:把DVD影碟,转换成RMVB视频。

核心原理
DGIndex是目前最好用的伺服器,提供从VOB文件到AVS脚本的数据传送。
本方案提供的步骤是,首先用DGIndex.exe读取VOB,生成D2V文件,然后用AVS脚本调用,完成视频数据流传送;用DGIndex将音频轨从VOB中分离出来,根据数据流编码格式的不同,在AVS脚本中,选择不同的解码器,完成视频数据流传送;利用SubRip等软件,将DVD影片中的点阵字幕分离,并转化成文本字幕,再通过VobSub插件挂载到AVS脚本中。最后调用gen_core,识别AVS文件为已制作好的脚本,直接导入,开始压制视频。

关于DGIndex的详细内容,请参考文章:DGDecode frameserving
http://www.doom9.org/mpg/dgindex-frameserving.htm

文章内容摘录:
DGDecode is today’s fastest way to frameserve MPEG-1/2 video to any video encoder via AviSynth. DGDecode and AviSynth 2.x allow the video to stay in the video’s native colorspace, so you won’t incurr quality loss and speed loss due to unnecessary conversions (unlike VFAPI, which converts everything to RGB and the encoder coverts it back to YV12).

DVD影碟的文件结构介绍,请参阅网络上的文章。我们主要用到VIDEO_TS里面的一系列VOB文件。

目前可以实现的功能
视频为MPEG2数据流,音频轨为AC3,LPCM(WAVE),或者MP2格式。可以加挂字幕,但是需要自己制作srt文本字幕。

需要工作环境:还需要DGIndex软件。

DGIndex的安装篇——

DGIndex 1.4.8 下载
http://cid-eaacf9754046f850.skydrive.live.com/embedrowdetail.aspx/applications/dgmpgdec148|_20060720.zip

注意,使用中的DGIndex的版本必须为一个,否则读取文件时会报错,提示版本互不兼容。

软件包里的文件简介:DGIndex.exe和DGIndex.ini两个文件为主程序和附带的配置文件,用来生成D2V文件、分离音频轨道。DGDecode.dll是AVISynth的插件,在AVS脚本中要用到。

安装方法
首先解压,把文件夹存放在一个自己熟悉的位置(以后要自己运行DGIndex.exe)。然后找到你安装AVISynth的文件夹,把DGDecode.dll复制到子文件夹“plugins”里面。复制的目的是减小gen_core的系统依赖程度,这样不需要在脚本里写入更多的内容。

复制完之后,就可以使用了。以下内容,可以在gen_core里面找到相似的信息,方式是双击gen_core,按照提示输入AD再按回车,即显示出简略的操作步骤。在了解了以下详细的步骤之后,可以用gen_core里面的文字来协助操作。

使用方法
Step 1. 获得VOB文件。这一步就不讲了,怎么把DVD光盘里的VOB文件存放到硬盘上是你自己的事。你需要把VIDEO_TS文件夹里面的所有文件都搞到。
Step 2. 生成D2V文件。启动DGIndex.exe,按F2打开,或者直接拖动VOB文件到DGIndex的窗口上去(拖动是天下最方便的操作~~哈哈),它会弹出一个File List对话框,意思是你可以同时处理几个文件,他们按照这个列表里的顺序,将被视为>>一个<<文件来处理。点击OK,然后按F4,询问保存位置,你就放在VOB的目录,确定以后时间条会走一遍,完成之后会有提示,这时候D2V文件就做好了。
Step 3.1. 分离音轨。刚才的DGIndex不要关,继续用他。。选择菜单项 File -> Demux Audio Only,会自动生成一个或多个音频文件。这里简要介绍一下DVD影片的音频轨道结构,音频流是交织存放在VOB文件中的,读取他需要特殊的方法,DGIndex就可以把它搞出来。因为DVD体系没有规定音频的格式,现行的格式有很多,主流的有三种:AC3是Dolby的专利,在获取高压缩比的同时几乎无损音质;LPCM也就是WAVE格式,扩展名是WAV,是无压缩数据流,音质要求较高的影片会采用此格式;MP2是MPEG2的音频格式,没啥好说的,介绍完毕。DGIndex会按照影片中的音轨情况,自动生成一个到多个音频文件,并且按照轨道号给文件命名,一般来说是每一种语言占用一个音频轨。因此你可以先试听一下那个是你希望听到的。
Step 3.2. 重命名音轨文件。接着上一步,这里是为了醒目。把需要的(希望听到的)音轨文件重命名,扩展名不要变,文件名和对应的VOB相同,也就是说,你把后面的一串“Track……”删去即可。
Step 4. 获取字幕。这一步很烦,真的很烦!你需要用SubRip之类的抓字幕软件,把VOB中的字幕搞出来,再通过这一类软件的OCR(光学字符识别)功能,把点阵字幕(就是8MB左右的sub文件)转换成SRT格式的文本文件。需要注意,gen_core使用SRT文本字幕,请转换成正确的格式。具体的操作步骤,不写了,太累了,您自己去google吧。。
Step 5. 手工部分的最后一步,就是确认以下几个文件存放在同一个文件夹中:VOB文件、与VOB文件同名的音频文件、字幕文件。
Step 6. 开始用gen_core处理!方法也是有多种,首先需要搞清楚,gen_core在这里的接口是D2V文件,也就是说,不管是拖动、命令行还是批处理调用,操作对象都是D2V文件,其他的文件都会自动识别调用。 因此方法如下:将D2V文件拖动到gen_core的图标上,gen_core自动识别文件为DVD影片,按照相关的AVS制作方法生成AVS文件,并存放在目标文件夹。这时再次将新生成的AVS文件拖动到gen_core的图标上,开始压制!
Step 6+. 批量调用方法:Step 1 – 5 是不能成批完成的,您受累了!批量处理d2v,可以用文件列表功能,把D2V文件列出来,做成批处理,运行,就生成了一堆AVS文件,再把这些AVS文件列出来,做成批处理,运行,就是批量视频压制了。

3    参数设置
新加进了如下的参数设置:

RM_AVGBITRATE=350000  此为RMVB的平均码率
RM_MAXBITRATE=700000  此为RMVB的最高码率
RM_MAXFRAMERATE=24    此为RMVB的帧率
RM_QUALITY=60         此为RMVB的画质
RemainAVSfile=0       这一项设置成“0”表示压制完成之后自动删除临时生成的脚本文件temp.avs,设置成“1”表示不会自动删除,用途是debug,比如视频老是压制有错,你可以检查一下avs脚本有没有问题,还可以利用gen_core来生成一个avs脚本,用暴风之类的播放器打开。。

关于RMVB视频参数的解释:
平均码率和最高码率两项决定文件大小,在没有“抖动”(英语是offset)的情况下,压制成的视频文件,其码率维持在平均码率附近。“抖动”是很不好的东西,会让码率倍增。gen_core方案尽量解决了抖动问题,根据经验……这个平均码率一般350-600就足够了,分辨率变大了就相应再提高一些,800-900对于RealVideo 9来说,已经很高了。
最大码率要设置成平均码率的两倍,不解释。
帧率一项,最低让他是24吧,人眼看不出画面的跳跃。
画质一项,是百分数的数字部分,60即可,有兴趣可以改动一下看看效果。其实这个画质决定不了什么,比如我看动画片,下载到的视频都是宽八百多像素的分辨率,因为脚本里的缩放语句调用的是Lanczos算法,所得到的画面比较锐利,这样压制出来的视频,虽然在电脑上看小了点,模糊了点,但是在MP4上看是很清楚的,看不到毛边、马赛克之类的东西。另一方面,画质很大程度的取决于片源的质量,这个也没什么好讲的,羊毛出在羊身上嘛~~

本次更新,文件尺寸又增加了3KB。

09.3 添加内容:
关于在producer编码阶段异常跳出的问题,还有声音不正常(没有声音、速率不对等等),大致可以归咎于解码器没有安装好。要解决这个问题,首先检查ffdshow是否安装好,如果在安装ffdshow之后又安装了其他的解码器(比如安装Adobe套件的时候就不知不觉装了,害得我一个晚上压的视频全都是半倍速声音),建议重新安装之。如果问题尚未解决,应该配置ffdshow,将它设置为相应视频/音频格式的首选的解码器,在ffdshow自带的设置界面里可以找到。如果问题仍然没有解决,建议尝试安装独立的解码器(应该是官方提供的或者有一定资质的来源)。

09.5.17
好囧一!文件名中包含括号的问题,解决了`
好囧二!最大文件个数扩充至五十个,使用循环解决问题。参考文章

Command prompt (Cmd. exe) command-line string limitation
http://support.microsoft.com/kb/830473/en-us

如果变量之中仍有变量,就要用到变量延迟 call 延迟 或setlocal 开启延迟
http://www.cn-dos.net/forum/viewthread.php?tid=41143

09.7.7
改动了一点压制的参数,另外改成圆括号替换为方括号。离最终版不远了。


 

– END –

Advertisements
  1. #2 by dtm on 三月 27, 2009 - 11:02 上午

    剽窃失败..

Log in or fill out contact info to leave a reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: