Èñïîëüçîâàíèå ñêðèïòîâ â Virtual Dub äëÿ àâòîìàòèçàöèè ðàáîò ñ âèäåî
Çàäà÷à ïî èñïîëüçîâàíèþ ñêðèïòîâ ó ìåíÿ âîçíèêëà, êîãäà ìíå ïîíàäîáèëîñü íàðåçàòü îêîëî 100 ôèëüìîâ íà jpeg-êàðòèíêè ÷åðåç êàæäûå 5 ñåêóíä. Ñ íåñêîëüêèìè ôàéëàìè ýòî ìîæíî áûëî áû ñäåëàòü âðó÷íóþ, íî 100 - äîñòàòî÷íîå êîëè÷åñòâî, ÷òîáû èçó÷èòü, êàê ìîæíî çàñòàâèòü virtual dub ðàáîòàòü ïî ñöåíàðèþ.
Ñêðèïòû è çàäàíèÿ
 Virtual Dub ìîæíî íàïèñàòü ëþáóþ çàäà÷ó ïî êîíâåðòèðîâàíèþ âèäåî, à çàòåì íå çàïóñòèòü åå, à ñîõðàíèòü êàê çàäàíèå (job). Ýòèì ÿ è âîñïîëüçîâàëñÿ. Job-ôàéë îêàçàëñÿ ïðîñòûì òåêñòîâûì ôàéëîì ïðèìåðíî òàêîãî âèäà:
// VirtualDub job list (Sylia script format)
// This is a program generated file -- edit at your own risk.
//
// $numjobs 1
//
// $job "Job 1"
// $input "F:\09003027.mpg"
// $output "*.tga"
// $state 0
// $start_time 0 0
// $end_time 0 0
// $script
VirtualDub.Open("F:\\09003027.mpg","",0);
VirtualDub.audio.SetSource(1);
VirtualDub.audio.SetMode(0);
VirtualDub.audio.SetInterleave(1,500,1,0,0);
VirtualDub.audio.SetClipMode(1,1);
VirtualDub.audio.SetConversion(0,0,0,0,0);
VirtualDub.audio.SetVolume();
VirtualDub.audio.SetCompression();
VirtualDub.audio.EnableFilterGraph(0);
VirtualDub.video.SetDepth(24,24);
VirtualDub.video.SetMode(3);
VirtualDub.video.SetFrameRate(0,1);
VirtualDub.video.SetIVTC(0,0,-1,0);
VirtualDub.video.SetRange(0,0);
VirtualDub.video.SetCompression();
VirtualDub.video.filters.Clear();
VirtualDub.audio.filters.Clear();
VirtualDub.subset.Clear();
VirtualDub.subset.AddRange(0,17596);
VirtualDub.SaveImageSequence("", ".tga", 0, 1);
VirtualDub.Close();
// $endjob
//
//--------------------------------------------------
// $done
Ôàéë çàäàíèé ïðåäñòàâëÿåò ñîáîé îäèí áîëüøîé ñêðèïò íà âñòðîåííîì èíòóèòèâíî ïîíÿòíîì ÿçûêå Virtual Dub, êîòîðûé êîììåíòàðèÿìè ðàçäåëåí íà îòäåëüíûå çàäàíèÿ. Êàê ïîêàçàëè òåñòû, øàïêó è çàâåðøàþùèé òåã $done óêàçûâàòü íåîáÿçàòåëüíî, äîñòàòî÷íî äëÿ êàæäîãî ñêðèïòà íàïèñàòü òåãè $script, $job è $endjob.
Ñêðèïò äëÿ âàøåé çàäà÷è âû ìîæåòå ïîëó÷èòü, ñîõðàíèâ çàäàíèå â ôàéë.  ïðèíöèïå, ìîæíî áûëî áû íå îôîðìëÿòü ñêðèïòû äëÿ íåñêîëüêèõ ôàéëîâ â âèäå Job-ôàéëà, à çàïèñàòü èõ îäíèì ñêðèïòîì, åñëè áû íå îäíî "íî". Äåëî â òîì, ÷òî åñëè Virtual Dub âûïîëíÿÿ ñêðèïò âñòðåòèò îøèáêó, îí îñòàíàâëèâàåò ñêðèïò. À âîò åñëè âûïîëíÿåòñÿ job-ôàéë òåêóùèé ñêðèïò îñòàíàâëèâàåòñÿ è íà÷èíàåò âûïîëíÿòüñÿ ñëåäóþùèé. Ïîýòîìó åñëè âû õîòèòå çàïóñòèòü êîíâåðòàöèþ íà âñþ íî÷ü, ëó÷øå äîîôîðìèòü êàæäûé ñêðèïò òåãàìè íà÷àëà è êîíöà çàäàíèÿ, çàïèñàòü åãî â job-ôàéë è çàïóñòèòü ýòîò job-ôàéë.
Job-ôàéë çàïóñêàåòñÿ èç ìåíþ File - Job conrol - Load Job List. Ñêðèï çàïóñêàåòñÿ èç ìåíþ File-Run script. Êñòàòè job-ôàéë ìîæíî çàïóñòèòü êàê ñêðèïò, âåäü òåãè íà÷àëà è êîíöà çàäàíèÿ îôîðìëåíû êàê êîììåíòàðèè. Íî ýòîò ñêðèïò îñòàíîâèòñÿ íà ïåðâîé æå îøèáêå.
 ñêðèïò-ôàéëå åñòü îäíà îñîáåííîñòü.  èìåíàõ ôàéëîâ âñå áåê-ñëåøè "\" çàìåíÿþòñÿ íà äâîéíûå áåê-ñëåøè "\\". Êðîìå òîãî äëÿ ðóññêèõ áóêâ èñïîëüçóåòñÿ êîäèðîâêà êîäîâ áóêâ, ïðèìåðíî òàê "F:\\\xd1\x83\xd0\xb4\xd0\xb0\xd0\xbb\xd1\x8f\xd1\x82\xd1\x8c". Ýòî íóæíî ó÷èòûâàòü äëÿ ïðàâèëüíîãî óêàçàíèÿ ïóòåé.
Ñêðèïò, ñîçäàþùèé ñêðèïò
Îêåé, ìû ðàçîáðàëèñü, êàê íàïèñàòü ñêðèïò äëÿ îäíîãî ôàéëà. Åñëè ó âàñ ìíîãî âèäåîôàéëîâ è âñåõ èõ íóæíî îáðàáîòàòü îäèíàêîâî, ìîæíî êîíå÷íî èñïîëüçîâàòü COPY/PASTE è ìåíÿòü òîëüêî èìÿ ôàéëà â ñêðèïòå, íî ãîðàçäî ïðàâèëüíåå íàïèñàòü ñêðèïò, êîòîðûé ñäåëàåò ýòî çà âàñ. ß ðàáîòàþ â Windows è èñïîëüçîâàë äëÿ ñâîåé çàäà÷è êîìàíäíûé ôàéë CMD.
 ìîåé çàäà÷êå âèäåîôàéë ñîõðàíÿëñÿ êàê ïîñëåäîâàòåëüíîñòü êàðòèíîê. Ïàïêà ñ êàðòèíêàìè äîëæíà áûëà ðàñïîëàãàòüñÿ â ïàïêå F:\PM è èìÿ ïàïêè äîëæíî ñîîòâåòñòâîâàòü èìåíè ôàéëà. Êñòàòè, Virtual Dub óìååò ñîõðàíÿòü êàðòèíêè òîëüêî â bmp èëè tga. Íî ïîòîì âñå êàðòèíêè ÿ êîíâåðòèðîâàë ÷åðåç ACDSEE.
Èòàê ÿ ñîçäàë â îäíîé äèðåêòîðèè äâà ñêðèïòà dubbing.cmd è test.cmd.
DUBBING.CMD
@echo off
rem %1 - script file
rem %2 - avi file
rem %3 - result dir
set sf=%~1
set workfile=%~2
set workdir=%~3%~n2
echo Script File: %sf%
echo Avi File: %workfile%
echo Result Dir: %workdir%
rem pause
if exist %1 goto skip_create
rem echo> %sf% // VirtualDub job list (Sylia script format)
rem echo>>%sf% // This is a program generated file -- edit at your own risk.
rem echo>>%sf% // $numjobs 1000
:skip_create
:addfile
md>nul "%workdir%"
set workfile1=%workfile:\=\\%
echo %workfile1%
set workdir1=%workdir:\=\\%
echo>> %sf% // $job "Job%workfile1%"
echo>> %sf% // $script
echo>> %sf% VirtualDub.Open("%workfile1%","",0);
echo>> %sf% VirtualDub.audio.SetSource(1);
echo>> %sf% VirtualDub.audio.SetMode(0);
echo>> %sf% VirtualDub.audio.SetInterleave(1,500,1,0,0);
echo>> %sf% VirtualDub.audio.SetClipMode(1,1);
echo>> %sf% VirtualDub.audio.SetConversion(0,0,0,0,0);
echo>> %sf% VirtualDub.audio.SetVolume();
echo>> %sf% VirtualDub.audio.SetCompression();
echo>> %sf% VirtualDub.audio.EnableFilterGraph(0);
echo>> %sf% VirtualDub.video.SetDepth(24,24);
echo>> %sf% VirtualDub.video.SetMode(3);
echo>> %sf% VirtualDub.video.SetFrameRate(0,1);
echo>> %sf% VirtualDub.video.SetTargetFrameRate(450,10000);
echo>> %sf% VirtualDub.video.SetIVTC(0,0,-1,0);
rem echo>> %sf% VirtualDub.video.SetRange(0,0);
echo>> %sf% VirtualDub.video.SetCompression();
echo>> %sf% VirtualDub.video.filters.Clear();
echo>> %sf% VirtualDub.audio.filters.Clear();
rem echo >> %sf% VirtualDub.subset.Clear();
rem echo >> %sf% VirtualDub.subset.AddRange(0,999999);
echo>> %sf% VirtualDub.SaveImageSequence("%workdir1%\\", ".bmp", 3, 0);
echo>> %sf% VirtualDub.Close();
echo>> %sf% // $endjob
Ýòîò ñêðèïò äîáàâëÿåò â ôàéë ñêðèïòà %sf% ñòðîêè ñî ñêðèïòîì. Êàê âèäèòå, òàêîé ñïîñîá óäîáíåå, ÷åì COPY/PASTE - åñëè íóæíî âíåñòè èçìåíåíèÿ â ñêðèïò, ýòî ìîæíî ñäåëàòü òîëüêî â ýòîì êîìàíäíîì ôàéëå è ïåðåãåíåðèðîâàòü çàäàíèå. Ôàéë èìååò òðè ïàðàìåòðà: ïåðâûé - èìÿ ôàéëà ñêðèïòà, âòîðîé - èìÿ îáðàáàòûâàåìîãî avi-ôàéëà, òðåòèé - ïàïêà, êóäà ñêëàäûâàòü êàðòèíêè.
Ìíå íåêîãäà áûëî çàíèìàòüñÿ ïðåîáðàçîâûâàíèåì ðóññêèõ áóêâ ïî øåñòíàäöàòèðè÷íûì êîäàì, ïîýòîìó ÿ ðàáîòàë òîëüêî ñ ëàòèíñêèìè íàçâàíèÿìè.  íà÷àëå áëîê êîìàíä set îáðàáàòûâàåò èìåíà ôàéëîâ, óäàëÿÿ èç íèõ êàâû÷êè, çàìåíÿÿ áåêñëåøè íà äâîéíûå ñëåøè, èçâëåêàÿ èìÿ âèäåîôàéëà èç åãî ïîëíîãî ïóòè.. Äëÿ óòî÷íåíèÿ ýòîãî ìîìåíòà çàïóñòèòå êîìàíäó set /? è óâèäèòå âñå âîçìîæíûå ðåæèìû ðàáîòû ýòîé êîìàíäû â Win 2K.
Ôàéë íå óäàëÿåò ôàéë çàäàíèÿ, îí òîëüêî äîáàâëÿåò â íåãî ñòðîêè. ÏÎýòîìó ñíà÷àëà ôàéë íóæíî î÷èñòèòü.
TEST.CMD
set sf=F:\_pm\vdub_job.jobs
del %sf%
call dubbing %sf% "F:\Films\Lost Highway CD1.avi" "F:\_pm\"
call dubbing %sf% "F:\Films\Lost Highway CD2.avi" "F:\_pm\"
rem for %%i in (f:\films\*.avi) do call dubbing %sf% %%i "F:\_pm\"
for /R f:\films\ %%i in (*.avi) do call dubbing %sf% %%i "F:\_pm\"
 ýòîì òåñòîâîì ïðèìåðå ïîêàçàíî, êàê ìîæíî îáðàáîòàòü èëè îòäåëüíûå ôàéëû, èëè ôàéëû â ïàïêå - êîìàíäà FOR. Êîìàíäà FOR ñ êëþ÷åì /R ïåðåáèðàåò ðåêóðñèâíî âñå ôàéëû â ïàïêå è ïîäïàïêàõ.
Îáðàòèòå âíèìàíèå, ÷òî â íà÷àëå ôàéë ñêðèïòà óäàëÿåòñÿ.
Âëîæåíèå: 2134857.rar