|
|
|
Video Capture 103 - Inverse Telecine with AVISynth
If you have no idea what IVTC is, make sure to read the relevant information in the previous
IVTC article.
AVISynth Introduction:
Unlike VirtualDub and most video editors, AVISynth is a script based editor. It's not as intuitive,
but it allows more dynamic video processing and additional flexibility.
AVISynth works by simulating AVI files. Your script files can be loaded by most programs that use
AVI as an input format (not all programs though).
Color Space:
Most people understand color space as RGB (Red Green Blue). However, TV Broadcast and Video Capture
work in the YUV color space. That's because YUV takes less data to represent a similar RGB image.
As much as half the data. And since your capture card and all MPEG (and most AVI) formats use YUV in
their encoding, converting the color space to RGB just slows down the encoding process. This is one
of the downsides of using VirtualDub's filters as they required an RGB input.
AVISynth by default works in YUV (YUY2 to be exact, a subset of YUV). This makes AVISynth faster at
image processing compared to VirtualDub. This also means that whenever you capture video, you must
capture to a YUV format (preferably YUY2).
Basic AVISynth Commands:
Since AVISynth is script based (a bit similar to a programming language), I'll go over the basic syntax
so you can understand how to work it. For the full command listing and the latest version of AVISynth head over to
Videotools.net.
Plugins:
LoadPlugin("x:\path\filename.dll"). The "LoadPlugin" commands should
always be the first commands in the script. These commands load additional capabilities into the
basic AVISynth package.
AVI Sources:
The first two command deal with the loading of Video Content. In theory, you would want your sources
to be either MJPEG or HuffYUV AVI files (best quality).
There are two commands to load an AVI file:
AVISource("filename1.avi","filename2.avi","filenameN.avi")
SegmentedAVISource("filename.avi")
The difference is that "AVISource" accepts specific file
names, one or more separated by a comma. "SegmentedAVISource" uses the specified file name and instead looks for segmented
file names that contain the specified name as a base. In the example given above, it would actually look for "filename.00.avi",
"filename.01.avi", etc... This is useful since a lot of capture programs use this syntax when capturing segmented AVI files
(which is used to bypass the 4gb file limit under the FAT32 file system).
Once you typed one of these commands into an AVS file (any file name with ".AVS" extension, use any text editor to create),
you should be able to load the file in VirtualDub (to test that the file loads correctly).
MPEG2 Sources:
Loading MPEG2 video sources is tricky. You must first obtain the "mpeg2dec.dll" plugin and add the
LoadPlugin("mpeg2dec.dll") command to the beginning of the script.
Next you need to use DVD2AVI (which can be obtained at doom9.org)
to load the MPEG2 sequences and use it to "Save Project" and the resulting ".D2V" file is loaded using
the MPEG2Source("filename.d2v") command.
The problem is, DVD2AVI will not relay the Audio, which would mean you will have to load it manually with the
WAVSource("filename.wav") command and make sure that the Audio is in fact
in PCM (uncompressed) Wave format first. With some MPEG2 capture cards, DVD2AVI will export an MP2 Audio file
when saving a project, in such cases you can use WinAmps' File Writer output plugin to convert this into a WAV file.
Color Space Conversion:
Since our filters always work in the YUY2 color space. If you are trying to enter a source which is in the RGB color space,
you must first convert the color format to YUY2. The Command is ConvertToYUY2(). You
must only use it if the source is in RGB (most sources aren't), and the command must directly follow one of the AVI
loading commands.
It is important to use "ConvertToYUY2()" rather than "ConvertToYUY2" due to a problem with
AVISynth which can cause slowdowns if the "()" symbols aren't included in all commands.
Crop & Resize:
Then there are two very simple commands to Crop and Resize the image:
Crop(X_Offset,Y_Offset,Width,Height)
BicubicResize(New_Width,New_Height)
For example, if we had a 768x576 source image, which we would like to resize to 640x480. However, there are
4 black lines on the left and 8 black lines on the right, 2 black lines at the top, 3 black lines at the
bottom which we would like to crop out before we resize. So what we would do is:
Crop(4,2,756,571)
BicubicResize(640,480)
The idea behind Cropping is, you set how many pixels to cut on the left and top sides, and then you set the
new width and height so that the bottom and right sides also get cropped.
|
|