노무현 대통령 배너
BLOG main image
왕미친놈의 왕미친세상입니다. 미친 소리는 써도 되지만, 근거 없는 소리는 쓰면 안 됩니다.


필터 설정 함수

[code php]2:1 reduce        설정 함수 없음.
2:1 reduce (HQ)        설정 함수 없음.
3x3 average        설정 함수 없음.
blur            설정 함수 없음.
blur more        설정 함수 없음.[/code] [code php]box blurvoid Config(int width, int power);
brightness/contrast    void Config(int brightness, int contrast);[/code] [code php]deinterlace        void Config(int mode);[/code]

0=섞음(blend), 1=복제1(dup1), 2=복제2(dup2), 3=버림1(discard1), 4=버림2(discard2), 5=겹치지 않음(unfold), 6=겹침(fold)

[code php]emboss            void Config(int direction, int height);
field swap        설정 함수 없음.[/code] [code php]fill            void Config(int x1, int y1, int x2, int y2, int color);[/code]

x1...y2: 픽셀 입력, 색상은 24비트 RGB (HTML 코드처럼 입력. 다만 # 대신 0x 사용)

[code php]flip horizontally    설정 함수 없음.
flip vertically        설정 함수 없음.
general convolution    void Config(int c0, int c1, int c2, int c3, int c4, int c5, int c6, int c7, int c8, int bias, int clip);
grayscale        설정 함수 없음.[/code] [code php]hsv            void Config(int h, int s, int v);[/code]

h: 색조(Hue) 조정, 0...65535 -> 0~360 도
s: 채도 배율, 0...131072 -> 0~200 %
v: 명도 배율, 0...131072 -> 0~200 %

[code php]invert            설정 함수 없음.[/code] [code php]levels            void Config(int inputlo, int inputhi, int gammacorr, int inputmid, int outputlo, int outputhi);
           void Config(int inputlo, int inputhi, int gammacorr, int inputmid, int outputlo, int outputhi, int lumaonly);[/code]

모든 인수는 0~255 값을 가집니다. 다만, 24비트 고정 소수점 수로 표현되는 gammacorr 인수 제외.

만약 lumaonly 인수가 0 이 아니면 필터는 RGB 대신에 luma로 작동합니다.

[code php]logo            void Config(string logoFile, int xpos, int ypos, int alphaEnable, int premultDisable, int xj, int yj, int opacity);
           void Config(string logoFile, int xpos, int ypos, string alphaFile, int premultDisable, int xj, int yj, int opacity);[/code]

logoFile:     로고 이미지의 파일명

xpos, ypos:     원점으로부터의 위치 (픽셀) (xj/yj 참조)

alphaEnable:    0 이 아니면 픽셀 단위의 투명도 켜기. 투명도는 알파 채널에 바탕을 두고 있다.

premultDisable:    0 이 아니면 미리 곱해지지 않은 알파값(non-premultiplied alpha) 이용

xj:        수평 조정

0 - 왼쪽
1 - 가운데
2 - 오른쪽

yj:        수직 조정

0 - 위
1 - 가운데
2 - 아래

opacity:    완전한 로고 위의 알파 상수, 0...65536

[code php]null transform        설정 함수 없음.[/code] [code php]resize            void Config(int w, int h, int/string mode);
           void Config(int w, int h, int/string mode, int framew, int frameh, int color);[/code]

필터 모드:

0     "가장 가까운 (nearest)" 또는 "점 (point)"
1    "이중 선형 (bilinear)"
2    "쌍삼차 (bicubic)"[각주:1]
3    (정밀한 이중 선형. 문자열 없음)
4    (정밀한 쌍삼차, 문자열 없음)

[code php]rotate            void Config(int mode);[/code]

0=좌로 90도, 1=우로 90도, 2=180도

[code php]rotate2            void Config(int angle, int filtmode, int color, int expandbounds);[/code]

angle : 24비트 소수 (16777216 = 360도)

filtmode : 0=점(point), 1=이중 선형, 2=쌍삼차

[code php]sharpen            void Config(int power);
smoother        void Config(int threshold, int use_blur_pass);
threshold        void Config(int threshold);
temporal softener    설정 함수 없음.
(motion blur)
temporal smoother    void Config(int power);[/code] [code php]TV            void Config(mode);[/code]

0=Y, 1=I, 2=Q, 3=avg3x3, 4=avg5x5, 5=5x5+tmp, 6=chromaup, 7=chromadown

다른 필터

도널드 그래프트(Donald Graft)의 스마트 디인터레이서(smart deinterlacer; 스마트한 인터레이스 제거기)의 버전이 VirtualDub 프로그램에 포함되어 있습니다.

[code php]void Config(int motion_only, int blend, int luma_threshold, int scene_threshold);[/code]

내 자막 표시기:

[code php]void Config(int enable_supersampling, string script_filename);[/code]

다른 것들은 당신이 필터 제작자에게 요청해야 합니다.

객체 : VirtualDub.audio.filters (VirtualDub 1.5 이상)

이 하위 객체는 필터 그래프를 고급 음향 모드(advanced audio mode)로 제어합니다.

[code php]void Clear();[/code]

고급 필터 그래프에서 모든 필터를 제거합니다.

[code php]int Add(string name);[/code]

그래프에서 음향 필터를 추가합니다. 필터의 이름은 UTF-8로 인코딩됩니다. 필터의 ID#를 반환합니다.

[code php]void Connect(int srcfilt, int srcpin, int dstfilt, int dstpin);[/code]

원본 필터(srcfilt/srcpin)에 있는 출력 pin으로부터 대상 필터(dstfilt/dstpin)에 있는 입력 pin까지 두 필터 사이의 연락을 짓습니다. 두 필터와 pin 번호는 0부터 시작합니다.

객체 : VirtualDub.audio.filters.instance[nFilt] (VirtualDub 1.5 이상)

nFilt 인수는 0부터 시작하는, 필터 그래프에서의 음향 필터의 색인입니다.

[code php]void SetInt(int parmidx, int value);
void SetLong(int parmidx, int valuehi, int valuelo);
void SetDouble(int parmidx, int valuehi, int valuelo);
void SetString(int parmidx, string value);
void SetRaw(int parmidx, int length, string base64value);[/code]

음향 필터를 위한 설정 매개변수를 설정합니다.

"parmidx" 인수는 설정 매개변수의 색인입니다.

long 형(64비트 정수형) 및 double 형(64비트 부동 소수점형) 매개변수를 위해, 먼저 해석된 상위 32비트를 가지고 값은 2개의 32비트 정수로 나뉩니다. (the value is broken into two 32비트 integers, with the high 32비트s being passed first.)

문자열 매개변수를 위해, 문자열 값은 UTF-8 코드와 같은 유니코드 문자열로 인코딩됩니다.

raw (binary) 매개변수를 위해, "length" 인수는 인코딩되지 않은 길이를 바이트 단위로 참조합니다. 그리고 "base64value" 인수는 MIME BASE64 인코딩을 사용하여 인코딩된 바이너리 데이터입니다.

[code php]void SetLong(int parmidx, long value);        // [VirtualDub 1.6 이상]
void SetDouble(int parmidx, double value);    // [VirtualDub 1.6 이상][/code]

이 오버로드는 1.5 버전에서 같은 이름의 raw 메소드에 해당합니다. 그 함수들이 long 형 및 double 형 변수를 직접 다루는 경우는 제외합니다.

음향 필터 매개변수

그것들은 VirtualDub 1.5.6 버전에 내장된 음향 필터를 위한 설정 매개변수입니다.

필터 Index/자료형 설 명
Gain 0 (double) 이득 계수[각주:2] (-8.0 ~ 8.0)
New rate 0 (uint32) 새로운 진동수 (단위 Hz)
Ratty pitch shift 0 (double) 음조를 일정 비율로 옮김 (0.5 to 2.0)
Lowpass/highpass 0 (uint32)
1 (uint32)
진동수 분리 (단위 Hz)
필터 탭 (대략의 품질)
Resample 0 (uint32)
1 (uint32)
새로운 진동수 (단위 Hz)
필터 탭 (대략의 품질)
Stretch 0 (double) 샘플링 속도(샘플링 레이트) 늘이기 (0.25 ~ 4.0)

VirtualDub.jobs 파일 형식

VirtualDub 프로그램에서 작업(Jobs)은 일반적인 텍스트 형식(plain text format)의 스크립트로서 저장됩니다. 그 스크립트는 추가적인 제어 매개변수를 가진, 특별한 형식을 가진 텍스트 문자열입니다. 그 작업 제어 파일을 직접 편집하기보다 VirtualDub 프로그램이 그 작업 제어 파일을 변경하도록 하는 것이 낫습니다. 하지만 텍스트 편집기 또는 외부 프로그램에서 편집하는 것이 유용합니다.

모든 제어 행은 달러 기호($)로 시작하는 토큰을 가진 주석 행이며, 그 행에는 선택적으로 행마다 오직 하나의 제어 연산(control op)을 가진 인수가 뒤따릅니다.

[code php]// $numjobs 3[/code]

이 행은 3개의 작업이 이 파일 안에 있다고 VirtualDub 프로그램에 알려줍니다. 평범한 스크립트로서 작업 파일(job file)을 실행할 수 있으며, 스크립트가 아닌 모든 명령은 주석으로서 저장됩니다. 작업 제어(job control)에서 오류 제어가 어렵더라도 각각의 부분은 분할된 스크립트로서 실행되며, 하나의 스크립트 안에서 생긴 오류는 다른 것의 실행을 막도록 오류는 그 분할된 스크립트 사이에 격리됩니다.

각각의 파일에서 추가적인 작업의 형식은 다음과 같은 형식을 가집니다.

[code php]    // $job "Job 1"
    // $input "f:\mkrtest.avi"
   // $output "f:\test.avi"
   // $state 2
   // $start_time 01c01df3 c2eb68c0
   // $end_time 01c01df3 eb3d85b0
   // $script

   <스크립트 명령>

   // $endjob[/code]

작업($job) 및 입력 파일명($input), 출력 파일명($output) 토큰은 이스케이프 문자를 포함할 수 없는 문자열임을 기억하십시오. 또한 입력 및 출력 파일명은 화면 표시용으로 쓰입니다. 그것들은 스크립트와 일치해야 하며 그것들을 변경해서는 안 됩니다(they should match the script but changing them will not change the files used.).

상태 ($state) 토큰은 작업 항목의 실행 상태를 제어합니다.:

0 WAITING 작업은 당장에라도 실행될 수 있습니다.
1 INPROGRESS 작업이 현재 실행중입니다. 작업 파일을 읽어왔을 때 VirtualDub 프로그램에서 이 태그가 보이면 작업이 중단된 것으로 봐야 합니다. 그리고 작업은 ABORTED 상태로 바뀝니다.
2 DONE 작업이 완료됐고, 실행될 필요가 없습니다.
3 POSTPONED 작업은 이미 실행되었으나 사용자가 연기시켰습니다. 따라서 생략되어야 합니다.
4 ABORTED 작업은 시작되었으나 완료되지는 않았습니다. 사용자가 WAITING 상태로 바꾸지 않는 한 VirtualDub 프로그램은 이 작업을 다시 시도하지 않습니다.
5 ERR

이 작업을 실행하는 동안 오류가 발생했습니다. 사용자가 WAITING 상태로 바꾸지 않는 한 VirtualDub 프로그램은 이 작업을 다시 시도하지 않습니다.

$start_time 및 $stop_time 토큰은 각각의 주어진 작업이 시작하고 멈추는 시간을 포함합니다. 시간은 두 개의 32비트 16진수 값으로서 저장됩니다. 첫 번째 것은 Win32 FILETIME 구조체의 dwHighDateTime 값이고, 두 번째 것은 dwLowDateTime 값입니다.두 값에서 0 (Zero)은 그 항목을 위한 어떤 시간도 가리키지 않습니다. 시작 시간 없이 멈춤 시간을 가지고 있음은 이해할 수 없습니다(It makes no sense to have a stop time without a start time.).

현재의 Sylia 스크립트는 $script 및 $endjob 표지를 하나로 몰아서 다루고 있습니다. 이것은 스크립트가 마지막―모든 작업 매개변수 명령보다 뒤에―에 와야 함을 뜻합니다. 이 스크립트에서, 다중 작업을 포함한, 어떤 명령이라도 실제로 유효합니다. 만약 다중 작업이 순서대로 나열될 필요가 있다면, 이것은 아마도 도움이 될 것입니다. 만약 처음 작업이 실패하면 다음 작업들은 실행할 수 없습니다. 호출 당시의 환경이 무엇이든 간에 스크립트는 실행합니다. 그래서 스크립트는 모든 매개변수를 알맞게 설정할 필요가 있습니다. 그리고 스크립트는 변수가 어떤 특별한 방법으로 설정된 구성인지를 추정할 수 없습니다.

이 글은 스프링노트에서 작성되었습니다.

  1. "bicubic" 은 쌍삼차 또는 겹삼차로 불리며, 3차로 부르기도 한다. 이는 보간법(interpolation)에서 자주 쓰이는 삼차 보간법(cubic interpolation)이 쌍삼차 보간법(bicubic interpolation)이기 때문이다. [본문으로]
  2. Gain factor입력에 대한 출력의 비율을 가리키는 표현으로 여겨집니다. 이와 비슷한 표현이 전기학에서 이득 계수이기에 그렇게 옮겼습니다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

스크립트 함수 레퍼런스

모든 함수는 객체의 멤버 함수입니다. 예컨대 Open() 함수는 VirtualDub 객체의 멤버 함수이고, 다음과 같이 접근합니다.:

[code php]VirtualDub.Open(...);[/code]
  • 경고 : 대부분 또는 모든 함수는 어떤 매개변수의 유효함을 알아낼 수 없다는 하에서 당신이 올바르지 않은 매개변수를 제공하면 데이터가 파괴될 수 있습니다. -10x-10 크기 변경 필터(resize filter)를 적용하는 것과 같은 어리석인 짓은 시도하지 마십시오.

객체 : Sylia

[code php]void dprint(int/string value);[/code]

이름 있는 문자열 또는 변수를 디버그 출력으로 인쇄한다.

[code php]void messagebox(string text, string caption);   // (VirtualDub 1.6.2 이상)[/code]

메시지 박스를 화면에 표시한다.

    NOTE:    메시지 박스는 VirtualDub 프로그램이 배치 또는 명령행 모드에서 실행 중이더라도 화면에 표시됩니다. 그래서 이것은 제작 스크립트에서는 사용하지 않는 것이 최선입니다.

[code php]string ToString(int);            // (VirtualDub 1.6.2 이상)
string ToString(long);            // (VirtualDub 1.6.2 이상)
string ToString(double);        // (VirtualDub 1.6.2 이상)
string ToString(string);        // (VirtualDub 1.6.2 이상)[/code]

수치 변수를 십진수 형식의 문자열로 변환합니다.

문자열-문자열 변환 버전은 아무것도 하지 않습니다. 그리고 문자열-문자열 변환 버전은 편의상 디버깅을 위해 임의 형식의 식을 화면에 표현하는 방식으로 존재합니다.

[code php]int Atoi(string s);            // (VirtualDub 1.6.5 이상)
long Atol(string s);            // (VirtualDub 1.6.5 이상)
double Atod(string s);            // (VirtualDub 1.6.5 이상)[/code]

문자열을 정수(int), 긴 정수(long int), 배정도 실수(double)로 변환합니다. 문자열은 숫자 표현이 유효하지 않기 때문에 변환에 실패하면 알 수 없는 오류가 나타납니다. 이러한 함수는 명령행 매개변수 문자열을 수치 형식으로 변환하는 데 유용합니다.

객체 : VirtualDub

[code php]void SetStatus(string text);[/code]

VirtualDub 창 아래쪽에 있는 상태 표시줄에 나타낼 텍스트를 설정합니다.

[code php]void Open(string filename, int type, int xopts);
void Open(string filename, int type, int xopts, string xoptstring);[/code]

동영상 파일을 연다. 형식은 다음 가운데 하나입니다.

[code php]   0   자동
  1   AVI
  2   MPEG-1
  4   스트립 AVI
  5   AVI through AVIFile (Avisynth)[/code]

xopts 값이 0 이 아니면, VirtualDub 프로그램은 파일을 확장된 열기 옵션으로 연다. xoptstring 값이 없으면, 대화상자가 열리고, 그게 아니면 xoptstring 문자열이 바이너리 옵션 구조의 MIME BASE64 방식으로 인코딩된 문자열로 처리됩니다.

[code php]void Open(string filename, string type, int xopts);
void Open(string filename, string type, int xopts, string xoptstring);    // (VirtualDub 1.5.5 이상)[/code]

이것은 우선권을 가진, 1.5.5 버전 이상에서 나타나는 Open() 함수의 형식입니다. 번호를 다루는 대신에, 그것은 형 이름을 다룹니다. 다음과 같은 형 이름이 있습니다.

[code php]   "Audio/video interleave input driver (internal)"
  "AVIFile/Avisynth input driver (internal)"
  "Image sequence input driver (internal)"
  "MPEG-1 input driver (internal)"[/code] [code php]void Open(string filename);        // (VirtualDub 1.6.5 이상)[/code]

그것은 파일 형식을 결정하는 자동 검출 모드를 항상 이용하는 Open() 명령의 더 간단한 형식입니다.

[code php]void Append(string filename);[/code]

추가적인 동영상 세그먼트(칸살)를 현재 파일에 덧붙입니다.

[code php]void Close();[/code]

현재 입력 파일을 닫습니다.

[code php]void Preview();[/code]

현재 설정 값으로 현재 파일의 미리보기를 실행합니다. 이것은 File > Preview 메뉴에 해당합니다.

[code php]void SaveAVI(string filename);[/code]

AVI2 형식으로 출력 파일을 만드는 처리 엔진을 실행합니다.

[code php]void SaveCompatibleAVI(string filename);[/code]

AVI1 형식으로 출력 파일을 만드는 처리 엔진을 실행합니다.

[code php]void SaveSegmentedAVI(string filename, int spacethresh, int framethresh);[/code]

다중 AVI 파일로 출력 파일을 만드는 처리 엔진을 실행합니다. spacethresh 값은 메가바이트 값으로 나타낸 파일의 최대 크기이고, framethresh 값은 최대 프레임 수입니다. framethresh 값이 0 이면 무시됩니다.

[code php]void SaveImageSequence(string prefix, string suffix, int mindigits, int format);
void SaveImageSequence(string prefix, string suffix, int mindigits, int format, int quality);    // (VirtualDub 1.6.0 이상)[/code]

"prefix#suffix" 형식을 가진 파일명으로 이미지 시퀀스[각주:1]를 저장합니다. # 기호는 시퀀스 번호인데, 중간의 수치 값에 0을 덧붙인 형태입니다. format 값은 만들어지는 파일의 형식을 기술합니다.[각주:2]

[code php]   0 - Windows BMP
  1 - TARGA
  2 - JPEG      (VirtualDub 1.6.0 이상)[/code] [code php]void SaveWAV(string filename);        // (VirtualDub 1.4d 이상)[/code]

WAV 형식으로 출력 파일을 만드는 처리 엔진을 실행합니다.

[code php]void RunNullVideoPass();        // (VirtualDub 1.6.5 이상)[/code]

동영상 전용 모드(video-only mode) 처리 엔진을 실행합니다. 그러나 출력은 버립니다(사용하지 않습니다). 이것은 사용 가능한 출력을 만들지 않는 과정(pass)을 분석하는 데 동영상 필터 또는 코덱을 사용할 때 유용합니다.

[code php]void Log(string output);        // (VirtualDub 1.6.5 이상)[/code]

로그에서 정보 우선순위에 따라 항목을 출력합니다. VirtualDub 프로그램이 명령행에서 실행될 때, 텍스트는 또한 표준 출력으로 출력됩니다.

객 체 : VirtualDub.video

[code php]int GetDepth(int var);
void SetDepth(int var, int value);[/code]

var 변수가 0 이면, 이 함수들은 입력 색상에 영향을 주고, 그게 아니면 출력 색상을 다룹니다. GetDepth() 함수는 0 또는 1, 2 값을 반환합니다. SetDepth() 함수는 색상의 비트 값과 같은 16 또는 24, 32를 돌려줍니다. 나는 그것들이 왜 일치하지 않는지를 알지 못합니다.

당신에게 SetInputFormat() 및 SetOutputFormat() 함수 대신에 그것을 사용하라고 권고했습니다. 16/24/32비트 설정은 XRGB1555/RGB888/XRGB8888 형식에 각각 해당합니다.

[code php]void SetInputFormat(int format);    // (VirtualDub 1.6.0 이상)
void SetOutputFormat(int format);    // (VirtualDub 1.6.0 이상)[/code]

비디오 작업에 쓰일 입력 및 출력 형식의 우선권을 설정합니다.

[code php]0    자동 검출 / 입력과 같음
5    XRGB1555    16비트 555 RGB
6    RGB565        16비트 565 RGB
7    RGB888        24비트 888 RGB
8    XRGB8888    32비트 888 RGB + 투명도 (dummy alpha)
9    Y8        휘도만 적용 [16, 235]
10    YUV422_UYVY    4:2:2 YCbCr 인터리브, UYVY순
11    YUV422_YUY2    4:2:2 YCbCr 인터리브, YUY2순
14    YUV422_Planar    4:2:2 YCbCr 2차 평면 (YV16)
15    YUV420_Planar    4:2:0 YCbCr 2차 평면 (YV12/I420)
17    YUV410_Planar    4:1:0 YCbCr 2차 평면 (YVU9)[/code] [code php]int GetMode();
void SetMode(int mode);[/code]

동영상 작업 모드 설정:

[code php]      0   직접 스트림 복사 (direct stream copy)
     1   빠른 재압축 (fast recompress)
     2   느리 재압축 (slow recompress)
     3   전체 작업 모드 (full processing mode)[/code] [code php]int GetFrameRate(int var);
void SetFrameRate(int var, int value);[/code]

value 값을 조절하여 특별한 프레임 레이트를 설정하거나 얻습니다.:

[code php]   var=0    프레임 레이트 요소 골라내기. 1=모든 프레임
  var=1    새로운 프레임 레이트 (마이크로초 / 프레임); 0=변화 없음, -1=기간이 일치함을 뜻함
  var=2    0 이 아니면, TV 역화면이 가능[/code]

시 간이 같으면 TV 역화면(inverse telecine)으로서 골라내기를 하는 프레임 레이트 설정을 하지 않습니다. 그것은 작동하지 않습니다.

[code php]void SetTargetFrameRate(int hi, int lo);    // (VirtualDub 1.5.2 이상)[/code]

64비트 유리수(rational fraction. hi 나누기 lo)로서 프레임 레이트 변환을 위한 대상 프레임 레이트를 설정합니다. hi 및 lo는 모두 *부호 없는* 수입니다. 21억 4748만 3648 부터 42억 9496만 7295까지인 값은 32비트 음수 값에 해당하므로 그냥 지나칩니다.

1.6.7 버전에서는, long 형으로 해석되는 큰 값으로서 모든 값을 양수로서 지정할 수 있습니다. 그리고 함수에 알맞은 int 값으로 자동으로 변환합니다.

[code php]int GetRange(int var);
void SetRange(int startMS, int endMS);[/code]

특별한 범위 값을 얻거나 설정합니다. var=0 이면 시작 오프셋으로 사용되며, var=1 이면 종료 오프셋으로 사용됩니다. 시작 오프셋은 앞에서부터 밀리초 단위로 측정되고, 종료 오프셋은 끝에서부터 밀리초 단위로 측정됩니다. 그래요, 이것이 어리석인 짓임을 나도 알아요.

종료 오프셋이 단지 오프셋이기 때문에 이 함수들에서 사용하는 동영상 스트림의 길이를 결정하는 것이 가능하지 않습니다.

[code php]void SetRangeEmpty();                // (VirtualDub 1.6.5 이상)[/code]

현재 선택한 부분을 청소하지만, 작업 영역의 시작/끝 지점에 영향을 주지 않는다. 이것은 UI에서 Edit > Clear Selection (Ctrl+D) 메뉴에 해당하며, 스크립트를 실행한 뒤 화면에 보여주는 그럴듯한 선택 영역 제거하는 데 유용합니다.

[code php]int GetCompression(int var);[/code]

현재 선택된 압축기(compressor)를 위한 변수를 검색합니다.:

[code php]      var=0   압축기(compressor)를 위한 fccHandler ID를 반환합니다.
     var=1   최대 키프레임 간격을 반환합니다.
     var=2   품질 인수(quality factor)를 반환합니다. (0~10000).
     var=3   데이터 전송률(data rate)을 반환합니다. (0=데이터 전송률 없음).[/code] [code php]void SetCompression();
void SetCompression(string fccHandler, int keyrate, int quality, int datarate);
void SetCompression(int fccHandler, int keyrate, int quality, int datarate);[/code]

인수 없는 구문은 동영상 압축(video compression)을 꺼버립니다. 다른 두 구문은 동영상 압축기를 선택합니다. fccHandler가 정수 또는 문자열로 지정될 수 있음을 기억하십시오. 문자열이 4바이트보다 짧으면, 공백이 덧붙습니다.

[code php]void SetCompData(int length, string data);[/code]

동영상 압축기를 위한 개인 코덱 데이터를 설정한다. 동영상 압축(Video Compression) 대화상자에서 당신이 설정(Configure)을 클릭할 때 동영상 압축기는 변경됩니다. 이 데이터는 VirtualDub에서 분명치 않습니다. 그리고 단지 동영상 코덱에서 쓰이기도 합니다. length는 바이트로 나타낸 데이터 블록의 길이이고, data는 MIME BASE64 형식으로 인코딩된 데이터 블록입니다.

[code php]void EnableIndeoQC(int enableQC);[/code]

 

Ligos (이전에는 Intel) Indeo v4.x/5.x 동영상 코덱에서 빠른 압축(Quick Compress) 사용 가능 또는 사용 불가

[code php]void SetIVTC(int enableIVTC, int ivtcmode, int offset, int polarity);[/code]

TV 역화면(inverse telecine) 매개변수 설정.

[code php]   enableIVTC:   0 이 아니면 IVTC 사용 가능
  ivtcmode:   0=필드 기반, 1=프레임 기반
  offset:      IVTC 패턴을 위한 프레임 오프셋, -1=적합한 값
  polarity:   0=필드 A 우선, 1=필드 B 우선. offset=-1 때는 무시한다.[/code]

VirtualDub 1.4c 버전에 버그가 있습니다. 그 버전에서 오프셋 값이 불린 자료형(0 또는 1)으로 캐스트되는 일이 발생했습니다. 이것을 불행하게도 IVTC에 알맞은 설정을 만드는 일을 불가능하게 만들었습니다. 그 문제는 1.4d 버전에서 고쳐졌습니다.

[code php]int width;        // [VirtualDub 1.4d (12667) 이상]
int height;[/code]

읽기 전용 변수로 주어진 원본 동영상의 너비/가로(width) 및 높이/세로(height). 이 변수들은 원본 동영상이 존재하지 않으면 정의되지 않습니다.

객 체 : VirtualDub.audio

[code php]void GetMode();
void SetMode(int mode);[/code]

음향 작업 모드(audio processing mode)를 얻거나 설정한다.

[code php]   0   직접 스트림 복사 (direct stream copy)
  1   전체 작업 모드 (full processing mode)[/code] [code php]int GetInterleave(int var);
void SetInterleave(int enabled, int preload, int interval, int is_ms, int offset);[/code]

음향 인터리브 매개변수를 얻거나 설정한다.

[code php]   값 얻기   설정        설명
  var=0   enabled      0 이 아니면 음향 인터리브는 사용 가능(enabled)
  var=1   preload      밀리초 단위로 미리 읽기(preload)
  var=2   interval      밀리초 또는 프레임 단위의 인터리브 간격(Interleaving interval)
  var=3   is_ms      0 이 아니면 인터리브 간격은 밀리초 단위입니다. (is in milliseconds)
  var=4   offset      오프셋(offset)을 바꿉니다. (단위: 밀리초)[/code] [code php]int GetClipMode(int var);
void SetClipMode(int begin, int end);[/code]

음향 오려내기(audio clipping) 매개변수를 얻거나 설정합니다. begin (var=0) 변수는 동영상이 나왔을 때 음향이 바뀌도록 지정합니다. 이것은 거의 언제나 0 이 아닙니다. end (var=1) 변수는 음향이 동영상보다 길지 않도록 오려내도록 지정합니다. 이것 또한 거의 언제나 0 이 아닙니다.

[code php]int GetConversion(int var);
void SetConversion(int new_rate, int new_precision, int new_channels);
void SetConversion(int new_rate, int new_precision, int new_channels, int integral_rate, int high_quality);[/code]

음향 변환 매개변수를 얻거나 설정합니다.

[code php]   var=0 (new_rate)   Hz 단위의 새로운 샘플링 레이트(샘플링 속도, sampling rate); 0=변화 없음
  var=1 (new_precision)   새로운 정밀도(precision); 0=변화 없음, 1=8비트, 2=16비트
  var=2 (new_channels)   0=변화 없음, 1=모노, 2=스테레오[/code] [code php]void SetSource(int mode);
void SetSource(string file);[/code]

음향 원본을 설정합니다. mode=0 이면 음향 없음, mode=1 은 음향 입력. 문자열 형식은 외부 WAV 파일을 읽어옵니다.

[code php]void SetCompression();
void SetCompression(int wFormatTag, int nChannels, int wBitsPerSample, int nAvgBytesPerSec, int nBlockAlign);
void SetCompression(int wFormatTag, int nChannels, int wBitsPerSample, int nAvgBytesPerSec, int nBlockAlign, int cbData, string data);[/code]

음향 압축 형식을 설정합니다. 첫 형식은 음향 압축을 깨끗이 지웁니다. 둘째 및 셋째 형식은 표준 Win32 WAVEFORMATEX 구조로부터 매개변수를 지정합니다.

[code php]   wFormatTag   음향 압축 형식 지정
  nChannels   1=모노, 2=스테레오.
  wBitsPerSample   8 / 16 PCM. 다른 것으로 바꿀 수 있음
  nAvgBytesPerSec   말 그대로 초당 평균 바이트 수
  nBlockAlign   압축된 데이터 블록의 크기[/code]

개 인 데이터에 음향 압축기(audio compressor)를 사용할 때 주어지는 이 필드는 VirtualDub를 불분명하게 만듭니다.

[code php]   cbData      데이터의 크기 (단위: 바이트)
  data      MIME BASE64 형식으로 인코딩된 데이터 스트링[/code]

일반적으로, 당신은 압축기를 조회하는 것 또는 VirtualDub 프로그램이 저장한 작업 스크립트(job script)를 찾는 것에 의해 이 필드를 유도하기를 바랍니다. 왜냐하면 음향 압축기(audio compressor)는 단지 지정된 값을 받아들이는 경향이 있기 때문입니다. 몇몇, 그러나 전부는 아닌, 개인적인 데이터 형식은 Win32 Platform SDK 안의 MMREG.H 파일로 문서화되어 있습니다.

[code php]void SetVolume();    // [VirtualDub 1.4d (12667) or later]
void SetVolume(int v);    // [VirtualDub 1.4d (12667) or later]
int GetVolume();    // [VirtualDub 1.4d (12667) or later][/code]

현재의 음량(audio volume) 증폭 값을 얻거나 설정합니다. 음량은 8비트 고정 소수점 수로 나타냅니다. 256은 증폭 없음, 128은 절반의 음량, 512는 2배의 음량입니다. 빈 인수 형식의 SetVolume() 함수는 음량 증폭을 사용할 수 없도록 만듭니다.

객체 : VirtualDub.subset

부분 집합(subset)은 동영상 스트림 작업을 위한 편집 목록(edit list)입니다. 이것은 프레임 범위의 집합으로 이루어져 있습니다. 프레임 범위는 원본 스트림 안에 있는 작업될 수 있는 프레임을 가리키는 범위입니다. 프레임 번호는 0부터 시작합니다(zero-based).

1.5.4 이전 버전에서는, 부분 집합은 부득이 원본 순서대로 정렬된 범위(range)를 포함할 수밖에 없었습니다. 그래서 범위는 추가할 때마다 다시 정렬되었습니다. 1.5.5 버전부터는, 부분 집합은 복제본이나 원본과는 다른 순서로 반복되거나 이용되는 동영상 스트림의 일부를 허용하는 범위를 벗어난 것을 포함합니다. 최고의 호환성을 위하여, 범위는 항상 오름차순으로 추가하기를 권장합니다.

[code php]void Delete();[/code]

편집이 허용되지 않을 만큼 부분 집합을 지웁니다. 전체 원본 파일에서 작업합니다. 객체는 단지 시작/끝(start/end) 오프셋만을 작업합니다.

[code php]void Clear();[/code]

존재하는 어떤 부분 집합이라도 제거하고, 프레임을 가지지 않는 새로운 하나의 부분 집합을 만듭니다. 이 작업은 부분 집합 구성을 시작하려고 AddFrame()/AddRange() 함수를 호출하기 전에 이루어집니다.

[code php]void AddFrame(int start, int length);
void AddRange(int start, int length);    // [VirtualDub 1.4.10 이상][/code]

부분 집합에서 프레임의 범위를 추가합니다. 부분 집합 프레임은 격리되어야 합니다. 그것들은 서로 겹치지도 접촉하지도 않아야 합니다. (예컨대, [0,5]와 [5,5] 등으로 하지 마십시오.) 1.5.5 버전부터는, 겹치는 범위 또는 허용 범위를 벗어난 범위가 허용됩니다. 그러나 이웃하는 범위는 여전히 피해야 합니다.

AddRange() 함수는 1.4.10 버전에서 더 나은 이름의 동의어로서 추가되었습니다. 그것은 AddFrame() 함수와 같으며, AddFrame() 구문은 지금 비난을 받습니다(deprecated).

[code php]void AddMaskedRange(int start, int length);    // [VirtualDub 1.4.8 이상][/code]

부분 집합에서 마스크된 프레임의 범위를 추가합니다. 마스크된 프레임은 이전 프레임을 반복하는 프레임입니다. 이것은 손상된 데이터를 가진 것으로서 다른 용도로는 쓰이지 않는 프레임을 위한 위치 표시기로 쓰입니다.

객체 : VirtualDub.params (VirtualDub 1.6.1 이상)

[code php]string operator[](int index);        // (VirtualDub 1.6.1 이상)[/code]

불러오기 (/i) 명령행 스위치로부터 매개변수를 검색합니다. 매개변수 색인은 0부터 시작하는데, 그래서 params[0]은 첫 매개변수가 됩니다. 매개변수가 가리키는 것이 존재하지 않으면, 오류가 발생합니다.

객체 : VirtualDub.project (VirtualDub 1.6.5 이상)

[code php]void ClearTextInfo();            // (VirtualDub 1.6.5 이상)[/code]

출력 AVI 파일과 연결된 텍스트 정보를 지웁니다. 기본적으로 주석을 입력 파일로부터 읽어와서 보존합니다.

[code php]void AddTextInfo(string fourcc, string text);[/code]

이를 테면 제작자 및 이름 문자열과 같은, 다음(subsequent) AVI 출력 파일에 사용할 텍스트 주석을 추가합니다. fourcc 값은 표준 AVI 텍스트 주석의 한 종류로서, 예컨대 "ISBJ" 및 "IART" 등과 같은 네 문자로 된 코드(FOURCC)여야 합니다. text 라고 지정된 두 번째 매개변수를 기억하십시오. 그것은 전혀 가공하지 않은(raw) 8비트 문자열인데, AVI 파일로부터 직접 복사됩니다. 그리고 두 번째 매개변수는 UTF-8 형식이 아닙니다. 그것은 AVI 형식 자체가 그러한 문자열로 코드 페이지 인코딩하여 표현할 방법을 전혀 가지고 있지 않기 때문입니다.

객체 : VirtualDub.video.filters

[code php]void Clear();[/code]

필터 목록에서 모든 필터 인스턴스(instance)를 제거합니다.

[code php]void Add(string filter);       // [VirtualDub 1.4c 이하]
int Add(string filter);            // [VirtualDub 1.4d 이상][/code]

동영상 필터 목록의 맨 아래에 지정된 필터의 새로운 인스턴스를 추가합니다.

VirtualDub 1.4d 버전부터 이 함수는 추가된 필터의 인스턴스 번호를 반환합니다.

객체 : VirtualDub.video.filters.instance[nFilt]

nFilt 값은 0 부터 시작하는, 필터 인스턴스의 변경된 색인 값입니다.

[code php]void Remove();[/code]

목록에서 선택된 필터를 제거합니다. 이것은 그 뒤에 오는 필터의 색인을 변경합니다.

[code php]int GetClipping(int var);
void SetClipping(int x1, int y1, int x2, int y2);[/code]

잘라내기 매개변수를 입력받는 필터를 얻거나 설정합니다. var 변수는 0부터 3까지의 범위를 가지며, 이것은 각각 x1 및 y1, x2, y2 변수에 해당합니다. 모든 값은 모서리(edge)로부터의 픽셀 값입니다.

[code php]... Config(...);[/code]

이것은 아마도 동영상 필터가 제공하는 함수입니다. 사용자 정의 매개변수를 가지고 있다면, 일괄처리 모드(batch mode)로 작업하기 위한 필터가 필요합니다. 그러나 이 구성원(member)을 강요할 어떤 구문도 없고, 매개변수 구문은 각각의 필터에 변화를 줍니다.

  1. 이미지 시퀀스(image sequence) 및 시퀀스(sequence) 는 영화나 동영상의 한 장면을 뜻합니다. [본문으로]
  2. 최신 버전인 1.9.x 버전에서는 PNG 형식으로도 저장할 수 있습니다. 스크립트에서 지원하는지는 확인하지 못했습니다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

VirtualDub 스크립트 언어 레퍼런스, v0.7

들어가기에 앞서

이 글은 VirtualDub scripting language reference, v0.7(http://www.virtualdub.org/docs/vdscript.txt) 문서를 한국어로 번역한 글입니다. 당연한 말이겠지만, 번역의 신뢰도는 그다지 높지 않습니다. 그러므로 이 글로 원문을 대체하여 사용하는 일이 없기를 바라며, 어디까지나 원문의 이해를 돕는 데만 사용해야 합니다. 이 번역문을 믿음으로써 발생하는 모든 사고와 피해에 대해서는 아무런 책임을 지지 않습니다.

이 문서는 VirtualDub's scripts 부분을 번역하였습니다.

머리말

이것은 VirtualDub의 대단한 스크립트 인터페이스를 기술한 문서입니다. 나는 이것을 VirtualDub의 라이선스와 같은, GNU General Public License (GPL)로 발표합니다. 이 참조는 VirtualDub 1.6.7 (WIP) 때부터 통용되며, 그리고 아마도 그 이전 버전에는 적용되지 않을 터입니다. 나는 이 레퍼런스를 자주 다시 업데이트할는지도 모르니, http://www.virtualdub.org/ 페이지를 자주 확인하기 바랍니다.

나는 스크립트 인터페이스를 중요한 일반적인 인터페이스가 되는 것을 고려하지 않았음을, 따라서 나는 이것을 언제든지 없애버리는 것에 대해 아무렇지도 않게 생각하고 있음을 기억하십시오. 나는 작업 스크립트를 망치지 않으려고 호환성을 유지하려고 노력합니다.

그러나 나는 바보짓을 한 적 있습니다(V1.4b). 당신들에게 경고했습니다.

-- Avery Lee <phaeron@virtualdub.org>
   2005년 6월 9일

VirtualDub 스크립트

VirtualDub 일괄처리 시스템은 스트립트 언어에 바탕을 두고 있으며, 그 스크립트는 프로그램 디렉터리에 있는 VirtualDub.jobs으로 불리는 파일로 저장됩니다. 저장 대화상자에서 나중에 작업 단추(Defer button)[각주:1]를 클릭하면, 작업 처리를 시작할 정보가 이 파일에 기록됩니다. 이것은 텍스트 파일이며, 그래서 그것은 손수 편집할 수 있으며 외부 프로그램으로 만들 수도 있습니다. 당신은 어떻게 이 작업이 이루어지 익숙해질 때까지 몇 개를 만들어보기를 원할 것입니다.

도움말 파일에 기록된 명령행 옵션은 당신이 배치 파일 또는 다른 프로그램으로부터 VirtualDub을 스크립트와 함께 실행하는 것을 허용합니다. 당신이 이런 작업을 한다면 다음과 같은 사항을 주의해야 합니다.

1) VirtualDub.exe 파일을 고객의 응용 프로그램과 함께 압축 파일로 묶지 마십시오. GPL은 소스 코드 없이 바이너리만 배포하는 것을 금지합니다. (GPL을 자세히 읽고 소스코드를 다운로드하겠다고 요청하지 않은 최종 사용자에게 당신이 액세스를 허용했을 때부터, 이것은 전적으로 진실이지는 않다.) 더구나 나는 문서 및 도움말 파일이 제거된 VirtualDub 프로그램을 보는 것을 좋아하지 않는다. 그런 일을 하지 말아 주십시오.

2) 당신의 응용프로그램과 VirtualDub 프로그램 사이에 매우 확실한 차별을 두십시오. 당신이 외부 응용프로그램을 실행하고 있음을 사용자가 알게 하십시오. 그리고 무슨 일이 잘못되었는지를 알게 하십시오. 나는 단지 한 사건을 겪었습니다. 그러나 나는 외부 응용프로그램이 바보짓을 할 때 내 프로그램이 결점이 있다고 생각하는 사람들로부터 지원해 달라는 이메일을 받고 싶지는 않습니다. 나는 이미 충분히 많은 이메일을 받습니다.

3) 당신의 스크립트를 VirtualDub.jobs 파일에 저장하십시오. 그러나 그것이 이미 존재하는 이전 파일을 덮어썼다면 나중에 복원하십시오. 이것은 이미 존재하는 사용자 스크립트를 보호하며, 작업 파일(job file)에서 사용자에게 오류를 보여주는 대신 VirtualDub 프로그램이 오류를 기록하게 하고, 작업을 중단합니다.

4) VirtualDub 프로그램에 내장되지 않은 필터를 당신이 사용하려면, 그것을 *반드시* VirtualDub 플러그인 디렉터리에 설치해야 합니다. 그렇게 설치된 플러그인은 VirtualDub 프로그램이 시작할 때 자동으로 읽어옵니다. VirtualDub 프로그램은 현재 외부 필터를 스크립트에서 읽어오는 일을 허용하지 않습니다.

5) 당신이 배치 파일에서 VirtualDub 프로그램을 실행하려면, 당신은 "start /wait" [각주:2]를 사용하여 실행할 필요가 있습니다. 그게 아니라면 VirtualDub 프로그램을 읽어온 뒤에도 배치 파일이 계속 실행될 것입니다. 프로그램에서 이용하려면, CreateProcess()를 이용하여 VirtualDub을 실행하고, VirtualDub 프로그램이 작업을 완료할 때까지 기다리려면 WaitForSingleObject()를 이용하십시오.

VirtualDub 스크립트 시스템은 대개 사용자 인터페이스를 통하여 같은 조작법을 제공합니다. 거기에는 어떤 숨겨진 기능도 없습니다. 그리고 몇몇 옵션은 스크립트에서 설정할 수 없습니다. 스크립트에서 캡처 모드 사용은 완전히 불가능합니다. 그러므로 캡처 기능을 위해 윈도 VCR을 설정하려고 시도하지는 마십시오.

Sylia: 세계 최악의 스크립트 언어

내가 이 스크립트 언어를 만들었을 때 내가 생각한 것을 나는 모릅니다. 그것은 매우 느슨하게 C 언어에 바탕을 두고 있습니다. 나는 이것을 만들기 전에 버블검 크라이시스(Bubblegum Crisis)[각주:3]를 보았습니다. 단지 세 가지 형의 변수(void, int, string)가 있고, 세 가지 키워드가 정의되어 있었습니다.

[code php]declare    var;    전역 변수를 지정된 형 없이 선언.
true        1
false        0[/code]

모든 문장 또는 식이 선언되지는 않으며, 모든 문장은 세미콜론( ; )으로 끝나야 한다. 어떤 흐름 제어도 없습니다. 함수도 없고, 프로시저도 없습니다. if / while / for / switch / goto 명령도 없습니다. Sylia는 클래스 객체와 배열을 지원합니다. 그러나 스크립트에서 그것들은 정의될 수 없거나 또는 사례를 들어 증명할 수는 없습니다. 객체는 변수에 할당될 수 있으며, 다음과 같은 경우에 유효합니다.

[code php]declare foo;
foo = VirtualDub.video.filters;
foo.Add("bar");[/code]

배열과 멤버 함수의 이름은 또한 변수에 할당될 수 있습니다. 후자의 경우, 변수가 역참조될 때까지 기다리는 것이 오버로드 해결책입니다.

상수는 아마도 정수 또는 문자열(string)입니다. 정수는 32비트이며 부호가 있습니다. 그리고 십진수/8진수(앞에 0을 붙임)/16진수(앞에 0x를 붙임)로 지정할 수 있습니다. -1L과 같은 형 접미사는 허용되지 않습니다. 문자열은 큰따옴표( " " )로 감싸야 하지만, 다음과 같은 C 언어 이스케이프 문자를 포함할 수 있습니다.

[code php]\a, \b, \f, \n, \r, \t, \v, \xhh, \\, \"[/code]

문자열은 아마도 널(null)을 포함하지 않습니다.

다음과 같은 C 언어의 연산자를 수식에서 지원합니다.

[code php]=    할당
+    정수 더하기, 문자열 연결 또는 양수 부호(단항 연산자)
-    정수 빼기 또는 음수 부호(단항 연산자)
*    정수 곱셈
/    정수 나눗셈
%    나머지 연산
[]    배열 색인 연산자
()    집합 표시 또는 함수 역참조 연산자
.    객체 역참조 연산자
~    비트 부정 연산잔 (bitwise not)
&    비트곱 연산자 (bitwise and)
|    비트합 연산자 (bitwise or)
^    비트 배타합 연산자 (bitwise xor)
!    논리 부정 연산자 (logical not)
==    정수 비교 (같은)
!=    정수 비교 (다른)
<    정수 비교 (작은)
<=    정수 비교 (작거나 같은)
>    정수 비교 (큰)
>=    정수 비교 (크거나 같은)
&&    논리곱 (logical and)
||    논리합 (logical or)[/code]

우선 순위는 C 언어와 같습니다. 0으로 나누기와 나머지 연산은 약간의 매스꺼움을 야기하거나, 불안정을 유발하거나, 또는 스크립트 에러를 발생시킵니다.

UTF-8 문자열 인코딩 (VirtualDub 1.5.5 이상)

VirtualDub 1.5.5 버전부터, Windows NT/2000/XP 하에서는 응용프로그램의 일부가 유니코드로 실행됩니다. 이는 8비트(ANSI)로 나타낼 수 없는 문자를 가지는 파일명이 존재함을 뜻합니다. 스크립트 명령어는 내부 필터의 예외에 따라 파일명을 받아들입니다. 지금은 ANSI보다는 UTF-8을 받아들입니다. UTF-8은, 멀티바이트 시퀀스를 사용하여 인코딩된 U+007F 위의 코드 포인트를 제외하면, Win32에서 사용하는 유니코드 인코딩인 UTF-16과 비슷합니다.

VirtualDub은 스크립트를 저장할 때 C 언어 형식의 \x 이스케이프 문자열을 사용하는  UTF-8 시퀀스를 이스케이프합니다. 그래서 심지어 파일명을 나타내는 때에도 스크립트 파일에서 상위 비트 문자는 전혀 볼 수 없습니다. 이것은 1.5.5 버전에서 스크립트가 ANSI 파일로서 읽어올 수 있음을 뜻합니다.

UTF-8 인코딩 또는 유니코드 표준에 대한 더 많은 정보는 유니코드 웹사이트 http://unicode.org/ 를 살펴보기 바랍니다.

추가적인 데이터 형 (VirtualDub 1.6.0 이상)

VirtualDub 1.6.0 버전부터, Sylia 스크립트는 64비트 긴 정수(long integer) (l) 및 배정도 실수 (d) 형, 변수, 상수를 지원합니다. 해석기(interpreter)는 메소드 원형에 어울리는 데에 필요하다면 자동으로 형 변환을 합니다. 다중 오버로드가 가능하다면, 먼저 목록에서 하나가 사용됩니다.

꾸미지 않은 문자열(VirtualDub 1.6.1 이상)

  • 옮긴이 주 : “Undecorated strings”을 “꾸미지 않은 문자열”로 옮긴 까닭은 UTF-8 문자열로 인코딩하지 않은 상태 또는 C 언어 이스케이프 문자를 쓰지 않은 상태를 가리키기 때문입니다.

이스케이프된 역슬래시를 포함하는 문자열 경로는 배치 파일에서 만들어지기 어렵고, 몇몇 언어는 UTF-8 변환을 지원하지 않습니다. Sylia 스크립트는 문자열을 위한 대체할 수 있는 구문을 지원합니다. 앞에 u 또는 U 문자가 붙은 문자열은 꾸며지지 않은, ANSI 인코딩된 문자열처럼 다루어집니다. 예컨대:

[code php]VirtualDub.Open(U"e:\test\test.avi");[/code]

문자열은 명령어 시스템에서 다루어지기 전에 스크립트 시스템 안에서 시스템 ANSI 코드페이지에서 UTF-8로 자동으로 바뀝니다. 이것은 이스케이프 또는 텍스트 변환이 필요 없이 스크립트 안에 파일 경로를 직접 삽입하는 것을 허용합니다.

참고로 위의 예제를 ANSI 문자로 나타내면 다음과 같습니다.

[code php]VirtualDub.Open("e:\\test\\test.avi");[/code]

스크립트 인수 (VirtualDub 1.6.4 이상)

불러오기 (/i) 스위치는 명령행으로부터 스크립트에 다다르는 매개변수를 허용하도록 추가되었습니다.

[code php]virtualdub /i foo.script in.avi out.avi[/code]

/i 스위치 뒤에 곧바로 나타나는 스위치가 없는 매개변수는 VirtualDub.params[] 배열에 자리 잡습니다. 위의 예제에서 VirtualDub.params[0]은 이렇게 문자열 "in.avi"를 반환합니다.

명령행 인터페이스 (VirtualDub 1.6.5 이상)

VirtualDub 1.6.5 버전부터, 명령행 모드에서 VirtualDub 프로그램의 실행이 가능합니다. 명령행 모드는 몇 종류의 배치 작업을 더 쉽게 만듭니다. 그럼으로써 vdub.exe (32비트) 또는 vdub64.exe (64비트)를 실행하십시오. 이것은 그때 프로그램의 출력 방향을 표준 출력으로 바꿉니다. 또한 이것은 오류가 발생하면 0 이 아닌 오류 코드를 반환합니다.

프 로그램을 /? 옵션과 함께 실행하면 명령행 도움말을 보여줍니다.

버전 조회 (VirtualDub 1.6.5 이상)

실행할 수 있는 빌드 번호를 VirtualDub을 종료할 때 나타내도록 하는 /queryVersion 플래그가 추가되었습니다. 이것은 프로그램의 다른 버전을 위해 더 쉽게 검출하고 조정하도록 만들어 줍니다. NT CMD 배치 파일를 실행하면 %ERRORLEVEL% 환경 변수에서 빌드 번호를 찾게 됩니다.

캐스팅 (VirtualDub 1.6.7 이상)

1.6.7 버전에서는, 수치형 자료 사이에서 C 언어 형식의 캐스트를 강제로 사용하는 것이 가능합니다.

[code php]Foo(1 + (int)4.0);[/code]

배정밀도 실수(double)로부터 롱(long) 또는 인트(int)로의 캐스팅은 0을 잘라내게 됩니다. 배정밀도 실수의 값이 대상 형식으로 표현할 수 없으면, 결과 값은 확정되지 않습니다. 롱(long)으로부터 인트(int) 결과 값으로의 캐스팅은 하위 비트를 보존합니다. 그리고 인트(int)으로부터 롱(long) 결과 값으로의 캐스팅은 부호를 확장합니다.

수치 값으로부터 문자열로, 문자열로부터 수치 값으로 캐스팅될 수 없습니다. Atoi() 및 Atol(), Atod(), ToString() 함수를 이용하십시오.

이 글은 스프링노트에서 작성되었습니다.

  1. 나중에 작업 단추(Defer button)는 VirtualDub 1.6.7 (WIP) 이후에 파일 저장 대화상자의 왼쪽 아래에 나타나는 체크 박스 및 메시지를 가리킨다고 여겨집니다. 나중에 이름이 바뀌었고, 결국 V1.9.x에서는 사라졌습니다. [본문으로]
  2. "start /wait"에 대한 자세한 사항은 명령 프롬프트에서 "start /?"를 입력하기 바랍니다. [본문으로]
  3. 버블검 크라이시스(Bubblegum Crisis)는 1987년작 일본의 애니메이션입니다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

한컴오피스 베타버전 버그 22 - 복사 및 잘라내기에서의 속도 지연 문제

이번 벌레는 제가 이벤트 기간에 보고하는 마지막 벌레가 되겠네요. 내일부터 ᄒᆞᆫ글로 작성한 글을 올리지 않을 생각입니다. 다시 스프링노트로 돌아가야겠죠.

아무튼 한컴오피스2010 베타버전에 포함된 ᄒᆞᆫ글을 사용하면서 가장 짜증나는 문제는 바로 복사와 잘라내기에서 생기는 속도 지연 현상이었습니다. 처음에는 단순히 제 시스템 문제로 여겼으나, 다른 두 컴퓨터, 아니 정확하게는 총 5대의 컴퓨터(그 가운데 세 대는 PC방 컴퓨터입니다.)에서 동일한 증상을 보였습니다.

1. 벌레의 유형

속도 지연은 단순한 문제의 수준을 넘어서 벌레라고 할 수 있는 심각한 수준입니다.

2. 개발자의 답변

2010년 1월 15일 버그 리포팅을 한 상태입니다.

3. 벌레의 발견

3.1. 벌레의 증상

일반 문자열을 복사하거나 잘라내기를 할 때도 속도 지연 현상을 보입니다. 하지만 진짜 압권은 하이퍼링크나 색깔을 지정한 문자열을 복사할 때입니다. 심지어 하이퍼링크가 포함될 때에는 단순히 지우기(Del 키)를 할 때도 약간의 지연 현상을 보입니다.

동영상을 먼저 보겠습니다.

3.2. 분석

동영상을 VirtualDub에서 불러와서 프레임 단위로 살펴보겠습니다. 참고로 이 동영상은 50fps, 다시 말해 50프레임이 1초 동안 나타납니다. 이는 프레임 1개에 0.02초라는 뜻이죠.

동영상에서는 일부러 키보드가 아닌 마우스 오른쪽 단추를 눌러서 메뉴를 부르고, 거기에서 잘라내기를 했습니다. 이는 시작 시점을 정확히 잡기 위한 방편입니다.

그림 1 잘라내기를 클릭한 직후

잘라내기를 클릭하고 조금 있다가 오른쪽 메뉴가 사라집니다. 그리고 화면 왼쪽 아래에 에너지바 형태가 나타나면서 화면이 조금 바꾸기 직전의 장면입니다. 편의상 잘라내기를 클릭한 직후라고 하겠습니다.

현재 프레임은 225번째 프레임입니다. 시간으로는 4.5초 지점이죠.

그림 2 잘라내기 작업을 하는 중.

위와 같이 열심히 잘라내기를 하고 있습니다. 뭐가 이리 오래 걸리는지….

그림 3 잘라내기 작업이 끝난 직후

잘라내기를 클릭한 뒤 열심히(?) 작업을 하고 나서 모두 끝난 직후의 화면입니다. 편의상 잘라내기 작업이 끝난 직후라고 하겠습니다.

현재 프레임은 651번째 프레임입니다. 시간으로는 13.020초 지점이죠. 총 426 프레임, 시간으로는 8.52초가 걸렸습니다.

미치지 않고는 못 배깁니다. ᄒᆞᆫ글 아이콘을 클릭하여 시작하는 시간도 불과 5초가 안 걸리는데, 잘라내기 한 번에 8초가 넘게 걸립니다. 한 번이면 참겠는데, 제가 글을 쓸 때 글 하나에서도 여러 번씩 복사 및 잘라내기 작업을 합니다.

이거 문제가 있지 않나요?

4. 벌레의 원인

도대체 왜 이렇게 복사 및 잘라내기가 오래 걸리는지 이유 및 원인이라도 알았으면 좋겠습니다. 딱히 겉으로 드러나는 문제는 없는데 왜 이러는지 모르겠습니다.

5. 비슷한 벌레

(없음)

6. 관련 문서

파일을 첨부했습니다. 필요하신 분은 받아서 시험해 보세요.

6.1. 내부 문서

[벌레와 팁/버그] - 상호 참조 뒤에 오는 조사 문제

[벌레와 팁/버그] - 글자판 설정에 따른 한영 자동 전환 버그

[벌레와 팁/버그] - 빈곳에 하이퍼텍스트 지정할 때의 버그

[벌레와 팁/버그] - 블로그 - (X)HTML 태그 표기 문제

● ┗ [벌레와 팁/버그] - 다른 이름으로 저장 및 HTML 코딩 문제

[벌레와 팁/버그] - 블로그 - 주석 사이의 간격

[벌레와 팁/버그] - 한글과컴퓨터 사전에서 탈자 하나

[벌레와 팁/버그] - 한글과컴퓨터 사전에 나타난 이상한 모양의 글자

[벌레와 팁/버그] - 맞춤법과 글자 모양

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 링크를 왜 엉뚱하게 표시하나요? 3

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 기본은 지켜야죠!

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 링크를 왜 엉뚱하게 표시하나요? 2

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 맞춤법 도우미로 엉뚱한 곳을 표시하면 어떡해요?

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 링크를 왜 엉뚱하게 표시하나요?

[벌레와 팁/제안] - 한컴오피스 베타버전의 공백과 이동 기능

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 블로그에는 글을 하나만 올리란 말입니다.

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! ‘ᄒᆞᆫ글’을 제대로 나타내면 안 되겠니? 2

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! ‘ᄒᆞᆫ글’을 제대로 나타내면 안 되겠니?

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 블로그 카테고리는 어디에?

[벌레와 팁/버그] - ᄒᆞᆫ글 씨! 블로그에는 게시판이 없거든요.

[벌레와 팁/버그] - HTML 태그 해석 오류 문제

[벌레와 팁/버그] - 도대체 무슨 짓을 하는 거냐, ᄒᆞᆫ글?

[프로그램/스크린샷] - 한컴오피스2010 베타버전 실행화면

[벌레와 팁/버그] - 한컴오피스2010 베타 설치 작업과 버그 몇 개

[프로그램/설치] - 한컴오피스2010 베타버전 설치기

6.2. 외부 문서 - 테스트 블로그

(없음)

이 글은 ᄒᆞᆫ글 2010 베타버전에서 작성하였습니다.

글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

동영상에서 오디오 부분만 제거하는 것은 앞서 썼던 동영상에서 오디오 부분만 작업하기 12를 응용하면 된다. 다시 말해 음향 부분만 조작하여 소리를 없애면 된다는 뜻이다.

참고로 이 팁은 내 블로그의 유입 경로를 살펴보고 작성하였다.

지난 번처럼 샘플 영상은 도스박스에서 만든 프린세스메이커 2의 오프닝 동영상이다.

VirtualDub에서 동영상의 오디오 없애기

편집에 앞서 GSpot을 이용하여 지난번에 봤던 동영상 정보를 다시 보자.

편집 전 동영상 정보

편집 전 동영상 정보

버추얼더브에서 위 동영상을 읽어오자.

VirtualDub에서 원본 파일을 불러온 화면

VirtualDub에서 원본 파일을 불러온 화면

일단 이번에도 동영상은 안 건드린다고 가정하겠다.

동영상의 영상 부분은 건드리지 말자.

동영상의 영상 부분은 건드리지 말자.

한편 오디오 설정에서는 아예 소리를 없애야 한다. No audio 항목을 선택하자.

동영상의 음향 부분에서 아예 오디오를 없애자.

동영상의 음향 부분에서 아예 오디오를 없애자.

이제 F7을 눌러 동영상을 저장하면 음성 정보가 없는 동영상이 만들어진다.

음향 정보가 없는 동영상 파일의 정보

음향 정보가 없는 동영상 파일의 정보

위 그림에 보면 컨테이너(Container) 부분에 Video만 나오고 Audio는 나오지 않는다. 또한 오디오(Audio) 부분에 아무런 내용도 출력하지 않는다. 이것은 당연하다. 이 동영상 파일에는 음향 정보가 들어 있지 않기 때문이다.

AVI-Mux GUI에서 동영상의 오디오 없애기

AVI-Mux GUI 프로그램에서 샘플 동영상을 불러오자.

AVI-Mux GUI에서 동영상 읽어오기

AVI-Mux GUI에서 동영상 읽어오기

동영상을 읽어온 화면에서 open files 목록에 있는 [AVI] D:\Usr\LCP\My Documents\1\z\pm2_001.avi 부분을 두번클릭하거나 generate data source from files(파일로부터 자료 소스 만들기) 단추를 클릭하면 아래에 있는 작업 창에 정보가 나타나게 된다.

이때 음향을 없애야 하기 때문에 음향에 관계된 부분은 모두 제거하자.

오디오 관련 정보를 제거한 화면

오디오 관련 정보를 제거한 화면

위와 같이 체크박스에서 체크 표시를 없애기 바랍니다. 위 그림에서는 자주색 네모로 표시한 부분에 체크 표시가 없습니다.

이것을 start 단추를 눌러 새로운 파일을 만들면 됩니다.

이제 GSpot으로 파일 정보를 보면 용량이 줄고 음향 정보가 없어졌음을 알 수 있습니다.

AVI-Mux GUI로 작업한 파일의 정보

AVI-Mux GUI로 작업한 파일의 정보

관련 문서

이 글은 스프링노트에서 작성되었습니다.


글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

앞서 VirtualDub(버추얼더브)에서 영상 부분은 가만히 두고 음향 부분만 수정하여 보았다. 그러면 이번에는 VirtualDub(버추얼더브)가 아닌 다른 프로그램에서 음향을 합쳐 보자. 물론 실제 음향 편집은 각자 좋아하는 프로그램을 이용하기 바라며, 음향에 들어 있는 음성 데이터는 건들지 않고, 음향 효과만을 추가하는 것이 좋다. 다만 지금 작업하는 파일은 음성이 포함되어 있지 않으므로 별로 상관 없는 이야기가 되겠다.

이번에도 도스박스에서 만든 프린세스메이커 2의 오프닝 동영상을 음향 부분을 작업하겠다.

VirtualDub에서 음향 빼내기

편집에 앞서 GSpot을 이용하여 지난번에 봤던 동영상 정보를 다시 보자.

편집 전 동영상 정보

편집 전 동영상 정보

버추얼더브에서 위 동영상을 읽어오자.

VirtualDub에서 원본 파일을 불러온 화면

VirtualDub에서 원본 파일을 불러온 화면

이 동영상에서 음향을 추출하는 방법은 의외로 쉽다. 파일(File) 메뉴에서 Save WAV... 항목을 선택하면 된다. 그러면 파일 저장 대화상자가 나타나는데, 거기에 알맞은 이름을 주면 동영상에 포함된 음향을 WAV 파일로 저장해 준다.

WAV 파일로 저장

WAV 파일로 저장

물론 저장하기에 앞서 오디오(Audio) 메뉴의 Compression 항목에서 적절하게 설정을 해 주면 바로 압축도 해준다. 여기서는 PCM을 그냥 유지하겠다. 여러 가지 이유가 있지만, PCM은 압축이 되지 않은 상태이므로 음질이 가장 좋기 때문이다.

음향 작업

동영상 파일에서 음향만 빼낼 수 있다. 이렇게 음향만 빼내는 이유는 영상 부분을 제외한 음향 부분만 따로 편집하기 위함이다. 이번에는 그저 압축만 시켜볼 생각이다. 각자 자신이 좋아하는 음향 편집 프로그램에서 음향을 편집하기 바란다.

음향을 압축하는 작업은 winLAME(윈라임)을 사용하기로 하자. 이것은 LAME(위키백과)의 윈도용 버전이다.

winLAME 실행화면

winLAME 실행화면

winLAME 실행화면에 보이는 아이콘에 먼저 설명하겠다.

  •  파일 열기 아이콘 - 당연히 사운드 파일을 불러오는 아이콘이다.
  •  삭제 아이콘 - 목록 창에서 작업하지 않을 파일을 제거할 때 쓰는 아이콘이다.
  •  재생 아이콘 - 확장자로 연결된 프로그램을 불러와서 사운드 파일을 재생한다.
  •  CD 아이콘 - 음악CD의 트랙에서 음악을 추출할 때 쓰는 아이콘이다.

음향 파일 열기

음향 파일 열기

이 음향 파일은 방금 추출한 프린세스메이커의 오프닝 사운드가 담겨 있다. 아래에 보이는 Next >> 단추를 클릭하면 다음 작업으로 넘어간다.

출력 설정

출력 설정

앞으로 저장할 때 WAV 파일로 하겠다면 Overwrite existing files 항목의 체크를 없애야 한다.

프리셋(Preset) 선택

프리셋(Preset) 선택

이미 만들어진 설정(Preset)을 선택한다. 직접 설정하고 싶다면 Custom settings를 선택하고, VirtualDub와 호환성을 갖는 파일을 만들려면 맨 아래 VirtualDub: audio track compression, CBR at 128 kbps를 선택한다.

LAME 인코더 설정

LAME 인코더 설정

LAME 인코더를 설정할 때는 세 가지를 주의해야 한다.

  1. 비트레이트(Bitrate) : 필요한 만큼만 설정한다. 대부분 음질을 좋게 한다며 192(kbps)나 심지어 256을 설정하기도 하는데, 영화 보면서 필요 이상으로 음질이 너무 좋을 필요가 없다는 사실도 좀 고려했으면 한다. CD 음질이라면 128이면 충분하며, 이번 경우에는 FM 음질이므로 64(kbps)이면 충분하다.
  2. 고정 비트레이트(Constant Bitrate; CBR) : 앞서 VirtualDub: audio track compression, CBR at 128 kbps를 선택했다면, 이 항목이 체크되어 있게 된다. 왜냐하면 동영상과 가장 호환성이 좋은 것이 바로 고정 비트레이트이며, 그 다음이 가변 비트레이트 가운데 VBR이고, 마지막으로 가장 호환성이 좋지 않은 것이 가변 비트레이트 가운데 ABR이다. 특히 VirtualDub은 ABR 음악 파일을 지원하지 않는다.
    물론 요즘에는 가변 비트레이트 사운드도 동영상에 자주 쓰이는데. 대표적으로 OGM 포맷이나 마트료시카 포맷(MKV) 등에서 쓰이고 있다.
    참고로 같은 크기의 파일에서 음질이 좋은 순서는 ABR, VBR, CBR이다. 다시 말해 CBR은 호환성이 가장 좋지만 음질은 셋 가운데 가장 처진다.
  3. RIFF WAVE 헤더 : MPEG Layer III 코덱(흔히 MP3 코덱)으로 압축한 WAV 파일이다. WAV 파일은 흔히 MP3 코덱으로 압축할 수 없다고 알려져 있지만, 이 경우에는 압축이 가능하다. VirtualDub의 옛 버전에서는 외부 오디오 파일로 RIFF WAVE 파일만 지원했다(지금은 mp3 파일도 지원한다.). 동영상 파일에서 음향(오디오) 부분이 MP3로 압축되어 있을 때, 그 음향을 WAV 파일로 추출하면, 그 WAV 파일의 헤더에 코덱이 MP3로 기록된다. 이와 같이 RIFF WAVE 파일은 대부분 동영상의 사운드 트랙을 추출한 WAV인데, 라임(LAME)에서는 이것을 사용자가 임의로 만들 수 있게 해준다. 이러한 형식으로 만드는 목적은 괄호에 영문으로 적혀 있듯이, 동영상의 영상 트랙과 함께 작업할 사운드 트랙을 만들기 위해서이다.

인코딩 화면

인코딩 화면

이때 인코딩 화면 및 트레이에 나타나는 아이콘을 설명하면 다음과 같다.

  •  / 
    시작 및 멈춤 아이콘 : 인코딩 작업을 시작하는 아이콘과 일시 정지 아이콘이다. 시작 아이콘을 클릭하면 멈춤 아이콘으로 바뀐다.
  •  작업 중지 아이콘 : 인코딩 작업을 강제로 종료하는 아이콘이다. 시작 아이콘을 클릭해야만 활성화된다.
  •  트레이로 보내기 아이콘 : 윈라임을 트레이로 보내는 아이콘이다.

    •  작업하지 않는 상태 : 윗줄 왼쪽 첫 번째 초록색 아이콘. 인코딩 작업이 이루어지지 않을 때는 초록색으로 나타난다.
    •  작업 중인 상태 : 윗줄 왼쪽 첫 번째 붉은색 아이콘. 인코딩 작업이 이루어지고 있을 때는 붉은색으로 나타난다.

인코딩 작업 중 화면

인코딩 작업 중 화면

일단 인코딩이 시작되면 인코딩 화면에 몇 번째 파일인지, 현재 몇 %나 작업이 진행되었는지, 얼마나 작업 시간이 남았는지 등과 작업 파일에 대한 정보를 알려준다.

인코딩 작업 끝!

인코딩 작업 끝!

방금 작업한 pm2_001.mp3 파일에 대한 정보는 다음과 같다.

GSpot에서 살펴본 pm2_001.mp3 파일 정보

GSpot에서 살펴본 pm2_001.mp3 파일 정보

영상에 음향 합치기 1 : AVI-Mux GUI 사용

AVI-Mux GUI 프로그램을 이용하여 비디오 파일에 오디오 파일을 합칠 수 있다. 이때 이미 비디오 파일에 오디오 정보가 있을 때에는 오디오 트랙을 2개 이상으로 만들 수도 있다.

AVI-Mux GUI의 처음 실행 화면

AVI-Mux GUI의 처음 실행 화면

파일 열기 1

파일 열기 1

파일을 추가하려면 open files 영역에서 마우스 오른쪽 클릭을 하면 위와 같이 add라는 컨텍스트 메뉴가 생긴다. 그것을 클릭하면 아래와 같은 열기 대화상자가 나타난다.

파일 열기 2

파일 열기 2

파일 열기 3

파일 열기 3

위 그림은 이미 하나 이상의 파일을 추가했을 때의 컨텍스트 메뉴이다. 여기에서도 마찬가지로 add를 클릭하여 열기 대화상자를 보이게 하면 된다.

다만 추가한 파일이 MP3 코덱을 사용한 때는 위와 같이 CBR 방식의 파일인지를 검사한다. 여기에서 예(Y)를 클릭하면 검사한 뒤 그 결과대로 화면에 표시하며, 아니오(N)를 클릭하면 VBR로 표시한다.

CBR 압축을 했음에도 VBR로 보여주는 화면

CBR 압축을 했음에도 VBR로 보여주는 화면

WAV 파일을 불러온 모습.

WAV 파일을 불러온 모습.

동영상 파일과는 달리 오디오 파일은 추가와 함께 아래 작업창에도 나타난다. 신경 쓰이더라도 꾹 참고 쓰기 바란다. 당장은 어쩔 수 없는 노릇이다.

  • 참고 : 이때 AVI-Mux GUI 프로그램에 몇 가지 버그가 있다.

    • 첫 번째 버그는 MPEG 1 Layer 3으로 나타나야 하는데 MPEG 2 Layer 3으로 나타나고 있다. mp3 파일과 RiFF WAV 파일에서 모두 나타난다.
    • 두번째 버그는 CBR로 압축한 mp3 파일임에도 위에는 VBR로 나타나는 때가 가끔 있다. 다만 RiFF WAV 파일의 경우에는 제대로 보여준다.

비디오 및 오디오를 모두 작업창에 나타나게 만든 화면

비디오 및 오디오를 모두 작업창에 나타나게 만든 화면

비디오 파일도 작업창에 나타나게 하려면 해당 비디오 파일을 더블클릭하면 된다.

최종 설정

최종 설정

여기에서는 오디오 트랙을 교체할 생각이므로 PCM 오디오 부분의 체크를 없앤다. 그 뒤에 all audio streams 항목의 체크도 없앤다. 만약 이것을 없애지 않으면 비디오 파일에 새로운 오디오 트랙을 추가할 뿐이다. 다시 말해 모든 오디오 정보를 동영상 파일에 기록하게 된다.

준비를 마쳤으면 오른쪽 아래에 보이는 start 단추를 클릭하자.

저장할 파일 이름

저장할 파일 이름

오디오를 비디오와 합치는 작업

오디오를 비디오와 합치는 작업

여기까지 하면 AVI-Mux GUI의 작업이 끝난다.

이제 GSpot으로 파일 정보를 보면 용량이 줄었음을 알 수 있다.

AVI-Mux GUI로 작업한 파일의 정보

AVI-Mux GUI로 작업한 파일의 정보

하지만 지금까지와는 달리 AVI-Mux GUI로 작업한 파일은 나름대로 정확하게 보여주고는 있지만, 파일 크기보다는 파일 형식에 대한 정보가 많다. 다만 전체 크기가 6.73 MB라는 사실만을 정확히 알려줄 뿐이다.

그래서 KMPlayer에서 읽은 다음 파일 정보를 살펴보았다.

KMPlayer에서 읽어온 파일 정보

KMPlayer에서 읽어온 파일 정보

위에서 보면 영상(Video Stream size)은 4.38 MiB, 음향(Audio Stream size)은 1.97 MiB이다. 이전에 버추얼더브로 작업한 파일과 그다지 다르지 않음을 알 수 있다.

일단 여기에서는 AVI-Mux GUI의 전체 사용법보다는 기본 사용법만을 소개하였습니다. 더 자세한 사용법은 직접 홈페이지 등을 참조하여 익히기 바랍니다.

영상에 음향 합치기 2 : VirtualDub 사용

버추얼더브에서도 음향을 외부에서 읽어올 수 있으므로 충분히 오디오 데이터를 교체할 수 있다.

버추얼더브에서 동영상 파일을 읽어온다. 이때 이미 편집 작업을 마친 오디오 파일을 가지고 있다고 생각하고 설명을 하겠다.

외부 오디오 파일 불러오기

외부 오디오 파일 불러오기

앞서 작업한 pm2_001.mp3 파일을 불러온다.

앞서 작업한 pm2_001.mp3 파일을 불러온다.

그런데 WAV 파일과는 달리 MP3 파일을 불러올 때는 다음과 같은 확인을 거친다.

불러오기 옵션 : MP3

불러오기 옵션 : MP3

"비트레이트 지원"이라고 적혀 있다. 맨 위에는 자동 검출(Autodetect), 가운데는 고정 비트레이트(CBR), 맨 아래는 가변 비트레이트(VBR)이다. 이 옵션이 나온 까닭은 일반 VBR과 CBR은 서로 확연한 차이를 보이지만, AVR(평균 비트레이트)과 CBR은 파일 크기에서는 전혀 차이를 보이지 않기 때문으로 여겨진다. 여기에서는 호환성을 고려하여 CBR로 압축했기 때문에 별다른 문제는 없었다.

그 뒤 비디오와 오디오 모두 Direct stream copy 항목을 선택했다. 만약 비디오를 다시 인코딩하고 싶다면 다른 인코딩 항목을 선택해야 한다. 마찬가지로 오디오를 다시 인코딩하려면 Full processing mode를 선택해야 한다.

설정을 마쳤으면 AVI 파일로 저장하면 된다.

버추얼더브에서 MP3 오디오를 불러 작업한 파일의 정보

버추얼더브에서 MP3 오디오를 불러 작업한 파일의 정보

관련 문서


이 글은 스프링노트에서 작성되었습니다.


글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

대부분의 경우 동영상을 편집할 때 영상과 음향을 함께 편집하기 보다 음향만을 따로 편집하여 나중에 합치고 싶을 때가 있다. 물론 이때 영상 부분은 전혀 편집하지 않고. 이럴 경우 영상 부분을 건드리지 않아야 함에도 많은 프로그램이 영상 부분을 건드려 버려서 난감할 때가 많다.

아주 유용한 AVI 편집 도구인 VirtualDub(버추얼더브)는 그러한 단점을 보완하여 아주 쉽게 오디오 부분만을 교체할 수 있게 해준다.[각주:1] 물론 이러한 경웨 쓸 수 있는 AVI-Mux의 GUI 버전인 AVI-Mux GUI라는 도구도 있다.

지난 번에 도스박스에서 만든 프린세스메이커 2의 오프닝 동영상을 영상 부분은 그대로 두고 음향 부분만 압축하여 다시 합쳐 보기로 하자.

VirtualDub에서 그냥 편집하기

비교 대상이 될 파일이 있으면 좋은 듯하여 VirtualDub에서 프린세스메이커 2의 오프닝 동영상을 편집하기로 했다. 이건 어디까지나 예제이므로 자막을 넣는다거나 동영상을 잘라내는 거창한 편집은 하지 않고, 그냥 인코딩만 다시 해 줄 뿐이다. 다만 동영상 코덱을 ZMBV 코덱에서 Xvid 코덱으로 바꾸었다.

편집에 앞서 GSpot을 이용하여 동영상 정보를 살펴보자.

편집 전 동영상 정보

편집 전 동영상 정보

영상은 4.39 MB, 음향은 21.7 MB로서 음향이 영상보다 훨씬 큰 조금 이상한 동영상 파일이다. 아닌 게 아니라 음향이 PCM(펄스 부호 변조)방식이라서 음향 신호를 단순히 이진 부호로 바꾸어 놓았을 뿐이다. 다시 말해 전혀 압축하지 않은 상태이다. 그래서 코덱이 전혀 필요없는 상태(No Codec Required)이기도 하다. 영상 코덱은 ZMBV 코덱으로 도스박스에 기본으로 포함되어 있는 코덱이다. 없다면 도스박스에서 찾아 설치하기 바란다.

VirtualDub에서 원본 파일을 불러온 화면

VirtualDub에서 원본 파일을 불러온 화면

동영상 파일을 불러온다. 단축키는 Ctrl+O 이다.

영상 압축 설정

영상 압축 설정

영상 압축을 설정한다. 단축키는 Ctrl+P 이다. 위 그림에서 Xvid MPEG-4 코덱을 선택했다. 메뉴에서 고를 때는 Video > Compression 이다.

Xvid 설정

Xvid 설정

Xivid 설정은 대부분 기본값을 그대로 사용하였다.

영상 부분의 압축 설정이 끝나면 음향 부분의 압축 설정을 해주어야 한다. Audio 메뉴에서 필요한 설정을 해 주어야 한다.

음향 압축을 위한 메뉴 설정

음향 압축을 위한 메뉴 설정

음향 압축을 위한 메뉴 설정에서 가장 중요한 것은 반드시 Full processing mode를 선택해야 한다는 점이다. 음향 압축의 기본값은 Direct stream copy 인데, 이것은 원본을 그대로 복사한다는 뜻이다. 다시 말해 아무런 작업도 하지 않는다는 뜻이다. 참고로 비디오의 Direct stream copy 항목도 원본을 그대로 복사한다는 뜻이다.

음향 압축 선택

음향 압축 선택

음향 압축을 보면 겨우 56 kBit/s 이다. 하지만 저 정도 샘플링으로도 충분히 원본에 가까운 소리를 들려줄 수 있다. 우리가 흔히 듣는 128 kBit/s 샘플링 음원은 음악CD에 맞춰 만들어져 있다. 그러나 도스 게임은 대부분 FM 음원에 맞추어 제작되었기 때문에 FM 음원에 알맞은 샘플링을 선택해야 하는데, 56 kBit/s이면 충분하다. 엄밀히 말해서 64 kBit/s이면 더 좋다.

파일 저장

파일 저장

설정을 마쳤으면 AVI 파일로 저장하자. 단축키는 F7이다.

파일 이름은 원본에 vd라는 꼬리표를 달아 주자.

파일 이름은 원본에 vd라는 꼬리표를 달아 주자.

동영상을 재압축하는 화면이다.

동영상을 재압축하는 화면이다.

Xvid 설정에서 기본값을 주고 다시 인코딩한 동영상 파일에 대한 정보는 다음과 같다.

위에서 보면 영상은 14.2 MB, 음향은 1.72 MB 이다. 음향이 줄었지만, 영상이 반대로 커져서 그다지 이익을 얻지 못하였다. 영상 부분이 그대로라면 훨씬 더 용량이 줄어들게 되니 음향만 인코딩하는 방법이 더 나을 듯하다. 다만 위에서 파일명 끝에 꼬리표가 vd2인 이유는 설명과는 달리 이게 두 번째 인코딩 파일이기 때문이다.

음향만 바꾸기

동영상 파일에서 음향만 빼낼 수 있다. 이렇게 음향만 빼내는 이유는 영상 부분을 제외한 음향 부분만 따로 편집하기 위함이다. 이번에는 그저 압축만 시켜볼 생각이다.

먼저 VirtualDub를 실행하여 동영상 파일을 불러오자.

영상 압축을 설정하기에 앞서 Video 메뉴의 Direct stream copy 항목을 선택한다. 이것을 선택하면 비디오 압축(Compression) 항목이 비활성화된다.

그 뒤 앞서 했던 음향 설정을 다시 해 주면 된다.

설정이 끝났으면 파일을 저장하자. 그런데 이번에는 매우 일찍 끝난다. 아까는 7분쯤 걸렸는데, 이번에는 30초쯤 걸린다.

물론 인코딩에 걸린 시간도 중요하지만, 더 중요한 것은 파일 크기이다. 화질이야 작업을 하지 않았기 때문에 처음 그대로일 테니까.

위에서 보면 영상은 4.39 MB, 음향은 1.72 MB이다. 이는 겨우 10메가바이트에도 이르지 않는 작은 크기이다.

방금 작업한 pm2_001-Compressed 동영상을 감상해 보자. 더구나 대부분의 게시판에서 10메가바이트 이하의 파일은 업로드를 지원하므로 바로 내려받기 할 수 있다.

관련 문서

이 글은 스프링노트에서 작성되었습니다.


  1. 나는 VirutalDub에서 지원하지 않는 기능으로 생각했으나, 아주 훌륭하게 지원해 주었다. 물론 VirtualDub는 최신 버전을 사용하기를 권한다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

VirtualDub(줄여서 VD)은 동영상을 캡처하거나 작업하는 유틸리티이다. 32비트 및 64비트 윈도(98/ME/NT4/2000/XP/Vista/7)를 모두 지원하며, GNU General Public License (GPL)로 배포된다. 이 프로그램은 어도비 프리미어에 견줄 수 있는 강력한 동영상 편집 프로그램이다. 일괄처리 기능은 파일이 많을 때 매우 유용하며, 또한 제3사의 비디오 필터를 일괄처리에서 이용할 수 있다. VirtualDub은 AVI 파일을 처리하는 많은 기능을 갖추고 있으며, 또한 MPEG-1 동영상을 읽을 수 있다(쓰기는 지원하지 않는다).

프로그램 정보

  • 프로그램 이름 : VirtualDub
  • 버전 : v1.9.5 (2009년 8월 23일자)
  • 저작권자/제작자 : 애버리 리(Avery Lee)
  • 분류 : 동영상 편집
  • 지원 운영체제 : Windows 98/ME/NT4/2000/XP/Vista/7
  • 홈페이지 : http://www.virtualdub.org/
  • 저작권 : GPL
  • 평가 : @@@@@@@@@@ ( 9 / 10 )
  • 스크린 샷 :
  • 설명 :
    동영상을 편집하거나 수정하는 데 좋은 프로그램이다. 다만 유일한 단점이 있다면, 음향은 그대로 두고 동영상만 작업할 수는 있지만, 동영상은 그대로 두고 음향만 작업할 수는 없다.
  • 기타 :

    1. 이 프로그램은 설치프로그램이 제공되지 않는다. 그냥 아무 폴더에나 압축을 풀어서 사용하면 된다.
    2. 처음 실행할 때 몇 가지 확인을 받는다.
    3. 소스코드가 필요한 사람은 받아서 볼 수 있다(GPL).

다운로드

관련 페이지

 

이 글은 스프링노트에서 작성되었습니다.


'소프트웨어 > 소개' 카테고리의 다른 글

Resize Browser  (2) 2009.12.29
Resource Hacker  (6) 2009.12.29
AVI-Mux GUI  (0) 2009.09.09
GSpot  (0) 2009.09.06
DOSBox  (0) 2009.08.25
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

카테고리

분류 전체보기 (1005)
스크립트 (22)
벌레와 팁 (126)
소프트웨어 (240)
하드웨어 (6)
이야기 (24)
말의 나무 (506)
미쳐보자 (22)
일기 (48)
아이폰 (10)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/12   »
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

글 보관함