From: Peter Knaggs Peter.Knaggs@oracle.com
To: members@penlug.org
Subject: [PenLUG] squash that video, save your disk :)
Date: Tue, 22 Jul 2003 15:31:35 -0700


In the following sections, we'll look at a couple of the digital
audiovisual formats we're likely to encounter when exploring the
world of video on linux. This document focuses mainly on using
transcode, although other encoders such as the MPlayer project's
"mencoder" can also do a fine job. But we're jumping ahead of ourselves :)
Let's start with some examples of the scenarios we're likely to encounter,
and the tried-and-tested methods used to deal with them.

-------------------------------------------------------------------------------

One popular digital format for audiovisual data is the somewhat-compressed
DV format. It's compressed just enough that it's fairly easy to read it into
most computers, with ordinary IDE hard drives (as long as DMA is enabled)


One common source of audiovisual streams in the DV format would be camcorders.
Another source would be devices such as the "Dazzle Hollywood DV-Bridge", which
(as explained by Rick Moen) can be used to create a DV stream from analog input
such as a VCR, allowing VHS tapes to be converted to DV streams. The conversion
is all done in hardware, no linux driver is needed. In any case, DV streams
consume a lot of disk space, even though they are compressed enough to overcome
the limitations of average IDE hard drives.

What if you would like to save some precious disk space, and compress those
DV streams even further, into avi files containing the video as an xvid codec
stream and the audio encoded as an MPEG audio layer 3 stream (more commonly
known as mp3)? Such avi files can be played back very conveniently on both
Windows and linux, although it seems that at the moment, standalone hardware
players are scarce.

In any case, once you have a DV stream available,
the first step is to read the DV stream into the computer
using "dvgrab" (http://kino.schirmacher.de/).
The second step is to compress the resulting file using "transcode".

For example, to compress the DV files read in from a "Sony TRV240 NTSC"
camcorder to xvid and mp3, one could use the following script,
courtesy of Florin Andrei (http://florin.myip.org/):

dvgrab --autosplit --format dv2 ./dv/${name}-
transcode -i ./dv -w 1400,250,100 -b 128,0,0 -B 15,20,8 -V -j 0,40,0,40 \

-I 1 -R 1 -x dv,avi -y xvidcvs,null -o /dev/null
transcode -i ./dv -w 1400,250,100 -b 128,0,0 -B 15,20,8 -V -j 0,40,0,40 \

-I 1 -R 2 -x dv,avi -y xvidcvs -o ./divx/${name}.avi

The transcode process is very CPU-intensive, and can be quite time-consuming,
depending on what options you choose. You may prefer to run multiple transcode
sessions on separate processors or separate machines to speed things up if you
are compressing a large number of files.

Explanation of the transcode options used:

"-w 1400,250,100" : tells transcode to encode the video with a bit-rate
of 1400kbps, 250 key-frames, crispness of 100.

"-b 128,0,0" : tells transcode to encode the audio with a constant
bit-rate of 128kbps.

"-x dv,avi" : tells transcode which import modules for video and audio
it should use.

"-V" : use YUV as the internal colorspace (much faster).

"-I 1" : enable de-interlacing mode. It may be faster to use
"-J dilyuvmmx", which is a fast de-interlacing routine.
If you're not in a hurry, or there is a lot of fast motion
in the source material, "-I 3 -C 2" can give nice results.

"-y xvidcvs" : tells transcode which export module to use.

"-R 1" : tells transcode that this is the first encoding pass, and
it should only look at the stream and determine the best
bit-rate to use to encode it, writing the result in a file
for the second encoding pass to make use of. The first pass
doesn't actually do any encoding.

"-R 2" : tells transcode that this is the second pass. Make sure
that it is able to open the file generated by the first
encoding pass.

"-B 15,20,8" : tells transcode to resize to
height-15*8 rows, width-20*8 columns.

"-j 0,40,0,40" : tells transcode to select the frame region by
clipping border. In general, the format is:
"-j top[,left[,bottom[,right]]]".

-------------------------------------------------------------------------------

Another popular digital audiovisual format is the digital versatile disc (DVD).
How versatile it can be remains to be seen, but in any case occasionally the
publishers of these discs write the files in plaintext.
This makes it convenient to experiment with the data using the various
transcode options, as well as the various video and audio codecs available.
Examples of such work would include the movies "Revolution OS" and "Blink 182".

Assuming your linux kernel has support for the UDF file-system, which is the
file-system which DVD files live in, then using a script such as the following
would create avi files containing the video stream in the xvid codec, and
the audio stream in the mp3 codec.

# For however many .VOB files exist in the VIDEO_TS directory of the DVD,
# usually there would not be more than 10, as they are usually 1GiB in size...
for ((COUNT=1; COUNT < 10; COUNT++))
do
export IN=/mnt/dvd/VIDEO_TS/VTS_01_$COUNT.VOB
export OUT=/mnt/local/work/VTS_01_$COUNT.avi

# Make a work directory for each of the transcode sessions to write
# the first pass required bit-rate scan results file, and go there to work.
# That way, if you decide to re-run the second encoding pass with different
# options, the scan file is still available and hasn't been overwritten.
mkdir /mnt/local/work/$COUNT
cd /mnt/local/work/$COUNT

# This resize option is for 'full-screen' 4:3 aspect ratio video streams.

export RESIZE="-g 720x480 -Z 640x480"
# This resize option is for 'wide-screen' aspect ratio video streams.
#export RESIZE="-B 12,10,8"

# Low bit-rate, 650. Resulting file will be small, but video may be very grainy.
#export BITRATE="-w 650,250,100"
# High bit-rate, 2500. Resulting file will be large, but video will be clear.
export BITRATE="-w 2500,250,100"

# A nice explanation of interlacing can be found at http://www.100fps.com/
# De-interlacing is the attempt to remove those artifacts by interpolation.
export DEINTERLACE="-I 3 -C 2"

# If audio stream is encoded in the ATSC A/52 codec (e.g. Dolby Digital AC3),
# you may prefer to just pass it on through directly, leaving it unchanged,
# as the open-source liba52.a library can decode ATSC A/52 streams quite well.
#export AC3PASSTHRU="-A -N 0x2000"

export AUDIO_CHANNEL="-a 0"
export AUDIO_BITRATE="-b 128,0,0"

transcode -i $IN -M 2 $BITRATE $DEINTERLACE $AUDIO_CHANNEL $AUDIO_BITRATE
$AC3PASSTHRU -V -f 25 $RESIZE -R 1 -x vob,null -o /dev/null -y xvidcvs
transcode -i $IN -M 2 $BITRATE $DEINTERLACE $AUDIO_CHANNEL $AUDIO_BITRATE
$AC3PASSTHRU -V -f 25 $RESIZE -R 2 -x vob -o $OUT -y xvidcvs
done

------------------------------------------------------------------------------

Another scenario is, what if you simply need to extract the audio stream,
to encode it as an mp3 file? Using a script such as the following should
be sufficient, keeping in mind that any given VOB file might contain multiple
audio streams, and selecting the right one using the "-a [0..7]" flags might
involve a little trial and error.

for ((COUNT=1; COUNT < 10; COUNT++))
do
export IN=/mnt/dvd/VIDEO_TS/VTS_01_$COUNT.VOB
export OUT=/mnt/local/work/VTS_01_$COUNT.mp3
transcode -i $IN -a 0 -x null,ac3 -g 0x0 -s 4.47 -y raw -m $OUT -E 44100
done


If you prefer to extract the audio stream as a wav file instead of an mp3 file,
perhaps so that you can more quickly make some modifications to it with it in
your favorite editor (e.g. audacity, snd), use the following instead:

for ((COUNT=1; COUNT < 10; COUNT++))
do
export IN=/mnt/dvd/VIDEO_TS/VTS_01_$COUNT.VOB
export OUT=/mnt/local/work/VTS_01_$COUNT.wav
transcode -i $IN -a 0 -x null,ac3 -g 0x0 -s 4.47 -y wav -m $OUT -E 44100
done


Remember that some audio streams tend to have very low volume levels, so it
might be necessary to use the "-s 4.47" flag to increase the volume by a
factor of 4.47, for example.

-------------------------------------------------------------------------------

References:
- Transcode, the Linux Video Stream Processing Tool (Dr. Thomas Ostreich):
http://www.theorie.physik.uni-goettingen.de/~ostreich/transcode/
- Transcode mailing list archives:
http://www.theorie.physik.uni-goettingen.de/pipermail/transcode-users/
- Transcode releases (now maintained by Tilmann Bitterberg):
http://www.zebra.fh-weingarten.de/~transcode/
- The xvid codec home-page:
http://www.xvid.org/
- The "kino" and "dvgrab" home-page:
http://kino.schirmacher.de/
- MPlayer "the movie player for linux" home-page:
http://www.mplayerhq.hu
- xine "a free video player" home-page:
http://xinehq.de/
- Audacity home-page:
audacity.sourceforge.net/
- The liba52 library - a free ATSC A/52 stream decoder implementation:
http://liba52.sourceforge.net
- Andreas Berntsen's explanation of how to convert from DV format:
http://reefer.porrgrodan.com/convert.php
- Interlacing explained:
http://www.100fps.com/
- Introduction to the mathematics of video compression:
http://www.cs.sfu.ca/undergrad/CourseMaterials/CMPT479/material/notes/Chap4/Chap4.2/Chap4.2.html
-------------------------------------------------------------------------------