mjpeg tools(1)
NAME
mjpegtools - MJPEG capture/editting/replay and MPEG encod
ing toolset.
SYNOPSIS
lav* -h prints out a command synopsis yuv* -h prints out a command synopsis mpeg2enc|mp2enc -? print out a command synopsis
What you can expect from the text
Description
Recording videos
Creating videos from images
Checking if recording was successful
Edit the video
Creating movie transitions
Converting the stream to MPEG or DIVx videos
Creating sound
Converting video
Putting the streams together
Creating MPEG1 Videos
Creating MPEG2 Videos
Creating VideoCD's
Creating SVCD's
Creating DIVX Videos
Optimizing the stream
Transcoding
Trading Quality/Speed
SMP and distributed encoding
Interoperability
DESCRIPTION
The mjpegtools are a set of programs that can do record
ing, playback, editing and eventual MPEG compression of
audio and video under Linux.
Although primarily intended for use with capture / play
back boards based on the Zoran ZR36067 MJPEG codec chip,
the mjpegtools can easily be used to process and compress
MJPEG video streams captured using xawtv or bcast2000
using simple frame-buffer devices.
INTRODUCTION
This isn't really a man page (yet). Its a modified ver
sion of the HOWTO for the tools intended to give an an
introduction to the MJPEG-tools and the creation of MPEG
1/2 videos. VCD and SVCD, and the transcoding of existing
mpeg streams.
For more information about the programs read the corre
sponding man-page. You'll find more information about the
other man pages in the SEE ALSO section.
You will usually have to load the drivers for the Buz or
DC10(+) or LML33 cards. So you have to run the update
script providing as option the name of your card you have.
The script is usually in /usr/src/driver-zoran/
If you compile the tools on a P6 based computer (PPro,
P-II, P-III, P-4, Athlon,Duron) then never try to let them
run on a P5 based computer (Pentium, Pentium-MMX, K6,
K6-x, Cyrix, Via, Winchip). You'll get an "illegal
instruction" and the program won't work.
If you compile the tools on another platform, not all
tools might work. The v4l (video4linux) stuff will very
likely fail to work.
Start xawtv to see if you get a picture. If you want to
use HW-playback of the recorded streams you have to start
xawtv (any TV application works) once to get the streams
played back. You should also check the settings of your
mixer in the sound card.
Never try to stop or start the TV application when lavrec
runs. If you start or stop the TV application lavrec will
stop recording, or your computer could get "frozen".
One last thing about the data you get before we start:
Audio: ( Samplerate * Channels * Bitsize ) / (8 * 1024)
CD Quality : (44100 Samples/sec * 2 Channels * 16 Bit ) /
(8 * 1024) = 172,2 kB/sec
The 8 * 1024 convert the value from bit/sec to kByte/sec
Video: (width * height * framerate * quality )/ (200*1024)
PAL HALF Size : (352*288*25*80) / (200*1024) = 990 kB/sec
PAL FULL size : (768*576*25*80) / (200*1024) = 4320 kB/sec
NTSC HALF size: (320*200*30*80) / (200*1024) = 750 kB/sec
NTSC FULL size: (640*480*30*80) / (200*1024) = 3600 kB/sec
The 1024 converts the Bytes to kBytes. Not every card can
record the size mentioned. The Buz an Marvel G400 for
example can only record a size of 720x576 when using -d 1
, the DC10 records a size of 384x288 when using -d 2.
When you add the audio and video data rates, this is what
your hard disk has to be able to write constantly stream
ing, else you will have lost frames.
If you want to play with the --mjpeg-buffer-size, remember
the value should be at least so big that one frame fits
into it. The size of one frame is: (width * height * qual
ity ) / (200 * 1024) = kB If the buffer is too small the
rate calculation doesn't match any more and buffer over
flows can happen.
How video works, and the difference between the video
types is explained here:
http://www.mir.com/DMG/
There you will also find how to create MPEG Still Images
for VCD/SVCD
RECORDING VIDEOS
Recording with lavrec looks like this:
> lavrec -f a -i P -d 2 record.avi
Should start recording now,
-f a: use AVI as output format,
-i P: use as input source the S-Video input with PAL for
mat,
-d 2: the size of the pictures are half size (352x288)
record.avi: name of the created file.
Recording is finished by pressing Crtl-C (nowadays:
Strg-C).
Other example:
> lavrec -f q -i n -d 1 -q 80 -s -l 80 -R l -U record.mov
Should start recording now,
-f q : use Quicktime as output format,
-i n : use Composit-In with NTSC format,
-d 1 : record pictures with full size (640x480)
-q 80: set the quality to 80% of the captured image
-s : use stereo mode (default mono)
-l 80: set the recording level to 80% of the max during
recording
-R l : set the recording source to Line-In
-U : With this lavrec uses the read instead of mmap for
recording this is needed if your sound card does not sup
port the mmap for recording.
The cards record at a different size in PAL when recording
at -d 1 :
BUZ and LML33: 720x576 and the DC10: 768x576
Other example:
> lavrec -w -f a -i S -d 2 -l -1 record%02d.avi
Should start recoding:
-w : Waits for user confirmation to start (press enter)
-f a : use AVI as output format,
-i S : use SECAM SVHS-Input (SECAM Composit recording is
also possible: -i s)
-d 2 : the size of the pictures are half size
-l -1: do not touch the mixer settings.
record%02d.avi : Here lavrec creates the first file named
record00.avi after the file has reached a size of 1.6GB
(after about 20 Minutes recording) it starts a new
sequence named record01.avi and so on till the recording
is stopped or the disk is full.
Other example:
> lavrec -f a -i t -q 80 -d 2 -C europe-west:SE20 test.avi
Should start recording now,
-f a : use AVI as output format,
-i t : use tuner input
-q 80: set the quality to 80% of the captured image
-d 2 : the size of the pictures are half size (352x288)
-C ..:choose TV channels, and the corresponding -it and
-iT (video source: TV tuner) can currently be used on the
Marvel G200/G400 and the Matrox Millenium G200/G400 with
Rainbow Runner extension (BTTV-Support is under construc
tion). For more information on how to make the TV tuner
parts of these cards work, see the Marvel/Linux project
on: http://marvel.sourceforge.net
Last example:
> lavrec -f a -i p -d 2 -q 80 -s -l 70 -R l -g 352x288
--software-encoding test03.avi
The two new options are -g 352x288, which sets the size of
the video to be recorded when using --software-encoding,
this enables the software encoding of the recorded images.
With this option you can also record from a bttv based
card. The processor load is high. This option only works
for generic video4linux cards (such as the
brooktree-848/878 based cards), it doesn't work for zoranbased cards.
All lavtools accept a file description like file*.avi, so
you do not have to name each file, but that would also be
a posibillity to do.
Note: More options are described in the lavrec man-page.
There are more options, but with this you should be able
to start.
How about some hints as to sensible settings. I habitually
turn quality to 80% or more for -d 2 capture. At full res
olution as low as 40% seems to be visually "perfect". -d
2 is already better than VHS video (a *lot*!). If you're
aiming to create VCD's then there is little to be gained
recording at full resolution as you need to reduce to -d 2
resolution later anyway.
Some information about the typical lavrec output while
recording:
0.06.14:22 int: 00040 lst:0 ins:0 del:0 ae:0 td1=0.014
td2=0.029
- It should look like this. The fist part shows the time
lavrec is recording. int: the interval between two
frames. lst: the number of lost frames. ins and del: are the number of frames inserted and deleted for sync correc
tion. ae: number of audio errors. td1 and td2: - are the audio/video time-difference.
- (int) frame interval
- should be around 33 (NTSC) or 40 (PAL/SECAM). If it
is very different, you'll likely get a bad recording
and/or many lost frames - (lst) lost frames
- are bad and mean that something is not working very
well during recording (too slow HD, too high CPU
usage, ...) Try recording at a with a greater decli
mation, and a lower quality - (ins, del) inserted OR deleted frames
- of them are normal -> sync. If you have many lost AND
inserted frames, you're asking too much, your machine
can't handle it. Take less demanding options, try to
use an other sound card. - (ae) audio errors
- are never good. Should be 0
- (td1, td2) time difference
- is always floating around 0, unless sync correction
is disabled (--synchronization!=2, 2 is default). - Notes about: interlace field order - what can go wrong and how to fix it
- Firstly, what does it mean for interlace field order to be
wrong. - The whole mjpegtools image processing chain is frame-ori
entated. Since it is video material that is captured each
frame comprised a top field (the 0th, 2nd, 4th and so
lines) and a bottom field (the 1st, 3rd, 5th and son on
lines). - There are three bad things that can happen with fields:
- 1. This is really only an issue for Movies in PAL video
where each Film frame is sent as a pair of fields. These
can be sent top or bottom field first and sadly its not
always the same, though bottom-first appears to be usual.
If you capture with the wrong field order (you start cap
turing each frame with a bottom rather than a top or vice
versa) the frames of the movie get split *between* frames
in the stream. Played back on a TV where each field is
displayed on its own this is harmless. The sequence of
fields played back is exactly the same as the sequence of
fields broadcast. Unfortunately, playing back on a Com
puter monitor where both fields of a frame appear at once
it looks *terrible* because each frame is effectively mix
ing two moments in time 1/25sec apparent. - 2. The two fields can simply be swapped somehow so that
top gets treat as bottom and bottom treat as top. Jud
dering and "slicing" is the result. - 3. Somewhere in capturing/processing the *order* in time
of the two fields in each frame can get mislabeled some
how. This is not good as it means that when playback
eventually takes place a field containing an image sampled
earlier in time comes after an image sampled later.
Weird "juddering" effects are the results. - How can I recognize if I have one of these Problems?
- 1. This can be hard to spot. If you have mysteriously
flickery pictures during playback try encoding a snippet
with the reverse field-order forced (see below). If
things improve drastically you know what the problem was
and what the solution is! - 2. Easy to spot: find a Channel logo or a picture or two
areas with a sharp horizontal boundary. If the top or
bottom line of an area appear to be "detached" you've got
this problem! - 3. Use "glav" to find some scene changes. If at the
change odd lines are from one scene and even from another
you've captured with the wrong field order. - How can you fix it?
- 1. To fix this one the fields need to be "shifted"
through the frames. Use yuvscaler's -M BOTT_FOR
WARD/TOP_FORWARD option can help here. Or re-record
exchanging -f a for -F A or vice-versa. I believe the same
applies to NTSC. - 2. This isn't too bad either. Use a tool that simply
swaps the top and bottom fields a second time. yuvscaler
can do this use the -M LINE_SWITCH. - 3. Is easy to fix. Either tell a tool someplace to rela
bel or simply tell the player to play back in swapped
order (the latter can be done "indirectly" by telling
mpeg2enc to reverse the flag (-z b|t) that tells the
decoder which field order to use. - Hey, what about NTSC movies?
- Movies are broadcast in NTSC using "3:2" pulldown which
means that half the capture frames contain fields from 1
movie frame and half fields from 2 frames. To undo this
effect for efficient MPEG encoding you need to use
yuvkineco.
CREATING VIDEOS FROM IMAGES
You can use jpeg2yuv to create a yuv stream from separate
JPEG images. This stream is sent to stdout, so that it
can either be saved into a file, encoded directly to a
mpeg video using mpeg2enc or used for anything else.
Saving an yuv stream can be done like this:
> jpeg2yuv -f 25 -j image%05d.jpg > result.yuv
Creates the file result.yuv containing the yuv video data
with 25 FPS. The -f option is used to set the frame rate.
Note that image%05d.jpg means that the jpeg files are
named image00000.jpg, image00001.jpg and so on. (05 means
five digits, 04 means four digits, etc.)
If you want to encode a mpeg video directly from jpeg
images without saving a separate video file type:
> jpeg2yuv -f 25 -j image%05d.jpg | mpeg2enc -o mpeg
file.m1v
Does the same as above but saves a mpeg video rather than
a yuv video. See mpeg2enc section for details on how to
use mpeg2enc.
You can also use yuvscaler between jpeg2yuv and mpeg2enc.
If you want to create a SVCD from your mpeg-video, type:
> jpeg2yuv -f 25 -j image%05d.jpg | yuvscaler -O SVCD
mpeg2enc -f 4 -o video.m2v
It's also useful to put yuvmedianfilter before mpeg2enc.
The resulting video will be softer but a bit less sharp:
> jpeg2yuv -f 25 -j image05d*.jpg | yuvmedianfilter
mpeg2enc -o video.m1v
It also depends on the quality (compression) of your jpeg
images whether yuvmedianfilter should be used or not.
You can use the -b option to set the number of the image
to start with. For example, if your first image is
image01.jpg rather than image00.jpg, type:
> jpeg2yuv -b 1 -f 25 -j image*.jpg | yuv2lav -o
stream_without_sound.avi
Adding the sound to the stream then:
> lavaddwav stream_without_sound.avi sound.wav stream.avi
The number of images to be processed can be specified with
the -n number.
For ppm input there is the ppmtoy4m util, there is also a
manpage for ppmtoy4m.
So to create a mpeg video try this:
> cat *.ppm | ppmtoy4m -o 75 -n 60 -F 25:1 | mpeg2enc -o
output.m1v
Cat's each *.ppm file to ppmtoy4m. There the first 75
frames (pictures) are ignored and next 60 are encoded by
mpeg2enc to output.m1v. You can run it without the -o and
-n option. The -F options sets the frame rate, default is
NTSC (30000:1001), for PAL you have to use -F 25:1.
Other picture formats can also be used if there is a con
verter to ppm:
> ls *.tga | xargs -n1 tgatoppm | ppmtoy4m | yuvplay
A list of filenames (ls *.tga) is given to xargs that exe
cutes the tgatoppm with one (-n 1) argument per call, and
feeds the output into ppmtoy4m. This time the video is
only shown on the screen.
The xargs is only needed if the converter (tgatoppm), can
only operate on a single image at a time.
If you want to use the ImageMagick 'convert' tool (a Swiss
Army Knife) try:
> convert *.jpg ppm:- | ppmtoy4m | yuvplay
That means take all '.jpg' images in directory, convert to
PPM format, and pipe to stdout, then ppmtoy4m processes
them ....
CHECKING IF RECORDING WAS SUCCESSFUL
You can use lavplay or glav.
IMPORTANT: NEVER try to run xawtv and lavplay or glav with
hardware playback, won't work. If you want software play
back it works fine.
> lavplay -p S record.avi
You should see the recorded video and hear the sound. But
the decoding of the video is done by the CPU. Your system
has quite a heavy load. You don't need xawtv or anything,
though.
The better way:
> lavplay -p H record.avi
The video is decoded and played by the hardware. The sys
tem load is now very low. This will play it back on-screen
using the hardware.
You might also try:
> lavplay -p C record.avi
Which will play it back using the hardware, but to the
videooutput of the card.
> glav record.avi
Does the same as lavplay, but you have an nice gui. The
options for glav and lavplay are nearly the same. Using no
option HW playback is used.
Using hardware playback a signal for the Composit and SVHS
OUT is generated, so you can view the movie on your TV.
> lav2yuv test.eli | yuvplay
Is a other way to get the video, without sound. You can
use yuvplay once in the encoding command. When you use
yuvplay in the encconding command you see the changes made
by filters, and scaling. You can also use it for slowmotion debugging.
NOTE: After loading the driver's you have to start xawtv
to set up some things lavplay and glav do not, but they
are needed for HW-Playback. Don't forget to close xawtv !!
NOTE2: Do not try to send glav an lavplay into background,
wont work correct !!!
NOTE3: SECAM playback is now (12.3.2001) only in
monochrome, but the recording and encoding is done right.
Coming soon: There is a tool, that makes recording videos
very simple named Linux Video Studio. You can download it
at: http://ronald.bitfreak.net
EDIT THE VIDEO
Most tasks can be easily done by glav. Like deleting
parts of the video, cut paste and copy parts of the
videos. For my part I was not in the need of doing any
thing that glav coudn't do.
The modifications should be saved because glav does not
edit (not destructive) the video. This means that the
video is left untouched, and the modifications are kept in
an extra "Edit List" file. Readable with a text editor.
This files can be used as an input file for the lavtools,
like lav2wav, lav2yuv, lavtrans.
If you want to cut off the beginning and the end of the
stream mark the beginning and the and, and use the "save
select" button. The edit list file is than used as input
for the lavtools. If you want to split a recorded video to
some smaller parts, simply select the parts and then save
each part to a different listfile.
You can see all changes to the video and sound NOW, you do
not need to recalculate something.
If you want to get an "destructive" version of your edited
video use:
> lavtrans -o short_version.avi -f a editlist.eli
-o : specifies the output name
-f a : specifies the output format (AVI for example)
editlist.eli : is the list file where the modifications
are described. You generate the list file with the "save
all" or "save select" buttons in glav.
Unify videos:
> lavtrans -o stream.movtar -f m record_1.avi record_2.avi
... record_n.avi
-o : specifies the output name
-f m: specifies the output format, movtar in this case
This is usually not necessary. Keep in your mind that
there is the 2GB file-size-limit on 32Bit systems with an
older glibc.
Separate pics and sound:
> lavtrans -o sound.wav -f w stream.avi
Creates a wav file with the sound of the stream.avi
Maybe need if you want to remove noise or something else,
or you want to convert it to an an other sound format for
other use.
An other version of splitting the sound is:
> lav2wav editlist.eli > sound.wav
Creating separate images:
> mkdir jpg
> lavtrans -o jpg/image%05d.jpg -f i stream.avi
First create the directory "jpg".
Then lavtrans will create single JPG images in the jpg
directory from the stream.avi file. The files will be
named: image00000.jpg image00001.jpg ....
Maybe interesting if you need sample images and do not
want to play around with grabbing a single image.
CREATING MOVIE TRANSITIONS
Thanks to pHilipp Zabel's lavpipe, we can now make simple
transitions between movies or combine multiple layers of
movies.
pHilipp wrote this HOWTO on how to make transitions:
Let's assume simple this scenery: We have two input
videos, intro.avi and epilogue.mov and want make intro.avi
transist into epilogue.mov with a duration of one second
(that is 25 frames for PAL or 30 frames for NTSC).
intro.avi and epiloque.mov have to be of the same format
regarding frame rate and image resolution, at the moment.
In this example they are both 352x288 PAL files. intro.avi
contains 250 frames and epilogue.mov is 1000 frames long.
- Therefore our output file will contain:
- - the first 225 frames of intro.avi
- a 25 frame transition containing the last 25 frames of - intro.avi
and the first 25 frames of epilogue.mov - - the last 975 frames of epilogue.mov
- We could get the last 25 frames of intro.avi by calling:
> lav2yuv -o 225 -f 25 intro.avi
-o 225, the offset, tells lav2yuv to begin with frame #
225 and -f 25 makes it output 25 frames from there on - Another possibility is:
> lav2yuv -o -25 intro.avi
Since negative offsets are counted from the end. - And the first 25 frames of epilogue.mov:
>l av2yuv -f 25 epilogue.mov
-o defaults to an offset of zero - But we need to combine the two streams with lavpipe. So
the call would be:
> lavpipe "lav2yuv -o 255 -f 25 intro.avi" "lav2yuv -f 25
epilogue.mov"
The output of this is a raw yuv stream that can be fed
into transist.flt. - transist.flt needs to be informed about the duration of
the transition and the opacity of the second stream at the
beginning and at the end of the transition:
-o num opacity of second input at the beginning [0-255]
-O num opacity of second input at the end [0-255]
-d num duration of transition in frames - An opacity of 0 means that the second stream is fully
transparent (only stream one visible), at 255 stream two
is fully opaque.
In our case the correct call (transition from stream 1 to
stream 2) would be:
> transist.flt -o 0 -O 255 -d 25
The -s and -n parameters equal to the -o and -f parameters
of lav2yuv and are only needed if anybody wants to render
only a portion of the transition for whatever reason.
Please note that this only affects the weighting calcula
tions - none of the input is really skipped, so that if
you pass the skip parameter (-s 30, for example), you also
need to skip the first 30 frames in lav2yuv (-o 30) in
order to get the expected result. If you didn't understand
this, send an email to the authors or simply ignore -s and
-n.
The whole procedure will be automated later, anyway. - Now we want to compress the yuv stream with yuv2lav.
>yuv2lav -f a -q 80 -o transition.avi Reads the yuv stream
from stdin and outputs an avi file (-f a) with compressed
jpeg frames of quality 80. - Now we have the whole command for creating a transition:
- >ypipe "lav2yuv -o 255 -f 25 intro.avi" "lav2yuv -f 25
epilogue.mov" | transist.flt -o 0 -O 255 -d 25 | yuv2lav
-f a -q 80 -o transition.avi - (This is one line.) The resulting video can be written as
a LAV Edit List, a plain text file containing the follow
ing lines: - LAV Edit List
PAL
3
intro.avi
transition.avi
epilogue.mov
0 0 224
1 0 24
2 25 999 - This file can be fed into glav or lavplay, or you can pipe
it into mpeg2enc with lav2yuv or combine the whole stuff
into one single mjpeg file with lavtrans or
lav2yuv|yuv2lav.
CONVERTING THE STREAM TO MPEG OR DIVX VIDEOS
If you want a one command conversation to mpeg videos try
lav2mpeg in the scripts directory.
The encoding with the lav2mpeg script looks like this for
mpeg1 output:
> lav2mpeg -a 160 -b 2110 -d 320x240 -o mpeg1 -O out
put.mpg file.eli
- will create a mpeg1 with videobitrate=2110 and audio=160
- and resolution 320x240
Or for the generation of mpeg2 output:
> lav2mpeg -o mpeg2 -O output.mpg file.eli
- will create a mpeg2 with default bitrate in same res as
input
However, better results can be accomplished by trying out
various options and find out which one works best for you.
These are discussed below.
The creation of MPEG1 movies is explained with more exam
ples, and with more details because most things that can
be used for MPEG1 also fit for the other output formats.
For the creation of VCD/SVCD Stills sequences (-f 6, -f 7
in mpeg2enc) you have to look at: http://www.mir.com/DMG/
Still sequences are needed for the creation of menus in
VCD/SVCD. The creation of menus is described in the doku
of vcdimager
CREATING SOUND
MPEG-1 videos need MPEG1-layer2 sound files. For MPEG-2
videos you can use MPEG1-Layer2 and MPEG1-Layer3 (MP3).
But you should stick to MPEG1-Layer2 because most of the
MPEG2 players (DVD Player for example usually the differ
ent Winxx Versions have great problems with this too) are
not able to play MPEG2-Video and MPEG1-Layer3 sound.
mp2enc is a MPEG layer 2 Audio encoder.
The toolame encoder is also able to produce a layer 2
file. You can use that one as well.
For mp3 creation I'm sure you have an encoder.
Example:
> lav2wav stream.avi stream1.avi | mp2enc -o sound.mp2
This creates a mpeg-2 sound file out of the stream.avi
with 224kBit/sec bitrate. You can specifie more files, and
also use the placeholder %nd. Where n describes the num
bers.
Another example:
> cat sound.wav | mp2enc -v 2 -V -o sound.mp2
This creates an VCD ( bitrate=224, stereo, sampling
rate:44100) compatible output from the wav file.
With -v 2 mp2enc is more verbose, while encoding you see
the sec of audio already encoded.
You can test the output with:
> plaympeg sound.mp2
NOTE: plaympeg is a MPEG1 Player for Linux, you can use
other players as well, for MPEG audio testing you can also
use mpg123.
CONVERTING VIDEO
You can create MPEG1 and MPEG2 videos.
Normally the first video you create is not the best ;) For
optimal quality/size you need to play with the bitrate,
search radius, noise filter .... The options of mpeg2enc
are described in the README in the mpeg2enc directory.
Example:
> lav2yuv stream.avi | mpeg2enc -o video.m1v
This creates an video file with the default bitrate of
1152kBit/sec. This is the bitrate you need if you want to
create VCDs.
Example:
> lav2yuv -d 2 stream*.avi | mpeg2enc -b 1500 -r 16 -o
video.m1v
There lav2yuv drops the 2 lsb (Less Significant Byte) of
the each pixel. Then mpeg2enc creates a video with a
bitrate of 1500kBit/s uses an search radius of 16. That
when trying to find similar 16*16 macroblocks of pixels in
between frames the encoder looks up to 16 pixels away from
the current position of each block. It looks twice as far
when comparing frames 1 frame apart and so on. Reasonable
values are 16 or 24. The default is 16 so adding the
option here is silly. Lower values (0, 8), improve the
encoding speed but you get lower quality (more visible
artifacts), higher values (24, 32) improve the quality at
the cost of the speed. With the file description of
stream*.avi all files are processed that match this pat
tern beginning with 00, 01....
Scaling:
Using yuvscaler one can now also scale the video before
encoding it. This can be useful for users with a DC10 or
DC10+ cards which captures at -d 1 768x576 or -d 2 384x288
(PAL/SECAM) or -d 1 640x480 (NTSC). These sizes cannot be
scaled right with the -s option from lav2yuv to VCD or
SVCD format. It is only scaled right with lav2yuv when
using a Buz or LML33 card.
You get a full description of all commands starting:
>yuvscaler -h
>lav2yuv stream.avi | yuvscaler -O VCD | mpeg2enc -o
video.m1v
This will rescale the 384x288 or 768x576 (PAL/SECAM) or
352x240 or 640x480 (NTSC) stream to the VCD-size 352x288
(PAL/SECAM) or 352x240 (NTSC) and encode the resulting
output YUV data to an mpeg stream.
It can also do SVCD-scaling to 480x480 (NTSC) or 480x576
(PAL/SECAM):
>lav2yuv stream.avi | yuvscaler -O SVCD - M BICUBIC
mpeg2enc -o video.m2v
The mode keyword (-M) forces yuvscaler to use the higher
quality bicubic algorithms for downscaling and not the
default resample algorithms. Upscaling is always done by
the bicubic algorithms.
Other Example
> lav2yuv stream.avi | yuvscaler -I USE_450x340+20+30 -O
SIZE_320x200 | mpeg2enc -o video.m1v
Here we only use a part of the input and have a special
output format.
Note: yuvscaler can also set a active area, and set every
thing else to real black using: -I ACTIVE_Widthx
Height+WidthOffset+HeightOffset
Like the -a option in lav2yuv.
Testing is done by:
> plaympeg video.m1v
Note: This are only examples. There are more options you
can use. You can use most of them together to create high
quality videos with the lowest possible bitrate.
Note2: The higher you set the search radius the longer the
conversion will take. In common you can say the more
options used the longer it takes.
Note3: MPEG1 was not designed to be a VBR (variable
bitrate stream) !! So if you encode with -q 15 mpeg2enc
sets the maximal bitrate -b to 1152. If you want a VBR
MPEG1 you have to set -b very high (2500).
Note4: Maybe you should give better names than video.m1v.
A good idea would be if you see the filename you know the
options you've used. (Ex: video_b1500_r16_41_21.m1v)
Another possibility is to call all the layer 2 files
".mp2" all the MPEG-1 video files ".m1v" and all MPEG-2
video files ".m2v". Easy to see what's happening then.
Reserve .mpg for multiplexed MPEG-1/2 streams.
PUTTING THE STREAMS TOGETHER (MULTIPLEXING)
Example:
> mplex sound.mp2 video.m1v -o my_video.mpg
Puts the sound.mp2 and the video.m1v stream together to
my_video.mpg
Now you can use your preferred MPEG player and watch it.
All players based on the SMPG library work well. Other
Players are: xmovie, xine, gtv, MPlayer for example.
Note: If you have specified the -S option for mpeg2enc
mplex will automatically split the files if there is in
the output filename a %d (looks like: -o test%d.mpg) The
files generated this way are separate stand-alone MPEG
streams!
Note: xine might have a problem with seeking through
videos.
Variable bit-rate multiplexing: Remember to tell mplex
you're encoding VBR (-V option) as well as mpeg2enc (see
the example scripts). It *could* auto-detect but it is
not working yet. You should tell mplex a video buffer
size at least as large as the one you specified to
"mpeg2enc". Sensible numbers for MPEG-1 might be a ceil
ing bit- rate of 2800Kbps, a quality ceiling (quantization
floor) of 6 and a buffer size of 400K.
Example:
> mplex -V -r 1740 audio.mp2 video_vbr.m1v -o
vbr_stream.mpg
Here we multiplex a variable bitrate stream. mplex is now
a single pass multiplexer so it can't detect the maximal
bitrate and we have to specify it. The data rate for the
output stream is: audio bitrate + peak videobitrate + 1-2%
for mplex information. If audio (-b 224) has 224kBit,
video has 1500kBit (was encoded with -b 1500 -q 9) then we
have 1724 * 1.01 or about 1740kBit.
Example:
> plaympeg my_video.mpg
or
> gtv my_video.mpg
CREATING MPEG1 Videos
For MPEG1 you can use mpeg layer 2 Audio and mpeg1 video.
A subset of MPEG1 Movies are VCD's.
You can use VBR (Variable BitRate) for the Video, but the
Audio has to be CBR (Constant BitRate).
MPEG1 is recommended for picture sizes up to 352x288 for
PAL and 352x240 for NTSC for larger sizes MPEG2 is the
better choice.
There is no exact line till where MPEG1 is better than
MPEG2.
Audio creation Example:
> lav2wav editlist.eli | mp2enc -o sound.mp2
This will fit the MPEG1 quite well. You can save some Bit
when telling to use a lower bitrate (-b option) like 160
or 192 kBit/s
> lav2wav editlist.eli | mp2enc -b 128 -m -o sound.mp2
This creates a mono output with an bitrate of 128kBit/sec
bitrate. The input this time is the editlistfile (can
have any name) created with glav, so all changes you made
in glav are direct processed and handed over to mp2enc.
So you do NOT have to create an edited stream with lav
trans to get it converted properly.
Video Creation Example:
> lav2yuv -n 1 editlist.eli | mpeg2enc -b 2000 -r 24 -q 6
-o video.m1v
There lav2yuv applies a low-pass noise filter to the
images. Then mpeg2enc creates an video with an bitrate of
2000kBit/s (or 2000000Bit/s) but the -q flag activates the
variable bitrate and an quality factor of 6. It also uses
a search radius of 24. An editlistfile used.
Explanation:
when mpeg2enc is invoked without the 'q' flag it creates
"constant bit-rate" MPEG streams. Where (loosely speak
ing) the strength of compression (and hence picture qual
ity) is adjusted to ensure that on average each frame of
video has exactly the specified number of bits. Such con
stant bit-rate streams are needed for broadcasting and for
low-cost hardware like DVD and VCD players which use slow
fixed-speed player hardware.
Obviously this is fairly inefficient as it means inactive
scenes use up bits that could better be "spent" on rapidly
changing scenes. Setting the 'q' flag tells mpeg2enc to
generate variable bit-rate streams. For such streams the
bit-rate specified is simply the maximum permissible. The
'q' parameter specifies the minimum degree of compression
to be applied by specifying how exactly picture
information is recorded. Typically, 'q' would be set so
that quiet scenes would use less than the specified maxi
mum (around 6 or 8) but fast moving scenes would still be
bit-rate limited. For archival purposes setting a maximum
bit-rate high enough never to be reached (e.g. 10Mbps) and
a q of 2 or 3 are reasonable choices.
Example:
> lav2yuv -a 352x240+0+21 stream.avi | mpeg2enc -b 1152 -r
16 -4 1 -2 1 -o video.m1v
Usually there is at the top and at the bottom a nearly
black border and a lot of bandwidth is used for something
you do not like. The -a option sets everything that is not
in the described area to black, but the imagesize
(352x288) is not changed.
So you have a real black border the encoder only uses a
few bits for encoding them. You are still compatible to
VCD's for this example.
To determine the active window extract one frame to the
jpeg format:
> lavtrans -f i -i 100 -o frame.jpg test.avi
Edit it with an grafic program, and cut out the borders,
and you have the active size.
The -4 1 and -2 1 options improve the quality about 10%
but conversion is slower.
At the size of 352x288 (1/2 PAL size, created when using
the -d 2 option when recording) the needed bitrate
is/should be between 1000 - 1500kBit/s.
Anyways, the major factor is quality of the original and
the degree of filtering. Poor quality unfiltered material
typically needs a higher rate to avoid visible artefacts.
If you want to reduce bit-rate without annoying artifacts
when compressing broadcast material you should try the
noise filters. This are for lav2yuv: -n [0..2] and -d
[0..3]. There are other filter which are described later.
Example:
> lav2yuv stream.avi | mpeg2enc -b 1500 -n s -g 6 -G 20 -P
-o video.m1v
Here the stream.avi will be encoded with:
-b 1500 : a Bitrate of 1500kBit/sec
-n s : the input Video norm is forced to SECAM
-P : This ensures, that 2 B frames appear between
adjacent I/P frames.Several common MPEG-1 decoders can't
handle streams where less than 2 B-frames appear between
I/P frames.
-g 6 -G 20 : the encoder can dynamically size the output
streams group-of-pictures to reflect scene changes. This
is done by setting a maximum GOP (-G flag) size larger
than the minimum (-g flag).
For VCDs sensible values might be a minimum of 9 and a
maximum of 15. For SVCD 6 and 18 would be good values. If
you only want to play it back on SW player you can use
other min-max values.
Example:
> lav2yuv -n 1 -a 352x220+0+34 stream*.avi | mpeg2enc -b
1500 -r 16 -4 1 -2 1 -S 630 -B 260 -o
video_n1_1500_r16_41_21_S630_B240.m1v
Here lav2yuv uses the low pass filter for optimizing the
pictures, also a part top and bottom border are set to
black. lav2yuv processes all the stream files. Then
mpeg2enc uses some options that make the encoded stream
look nicer. Using '-S 630' means that mpeg2enc marks the
stream so that mplex generates a new stream every 630MB.
One important thing is the use of the -B option which
specifies the non-video (audio and mplex information)
bitrate. The -B value of 260 should be fine for audio
with 224kBit and mplex information. For further informa
tion take a look at the encoding scripts in the scripts
directory.
Multiplexing Example
Example:
> mplex sound.mp2 video.m1v -o my_video.mpg
Puts the sound.mp2 and the video.m1v stream together to
my_video.mpg. It only works that easy if you have CBR (not
used the -q option).
Example:
> mplex -V -r 1740 audio.mp2 video_vbr.m1v -o
vbr_stream.mpg
Here we multiplex a variable bitrate stream. mplex is now
a single pass multiplexer so it can't detect the maximal
bitrate and we have to specify it. The data rate for the
output stream is: audio bitrate + peak videobitrate + 1-2%
for mplex information. If audio (-b 224) has 224kBit,
video has 1500kBit (was encoded with -b 1500 -q 9) then we
have 1724 * 1.01 or about 1740kBit.
CREATING MPEG2 Videos
MPEG2 is recommended for sources with a greater picture
than 352x240 for NTSC and 352x288 for PAL. MPEG2 can also
handle interlaced sources like recording from TV at full
resolution.
MPEG2 allows the usage of mpeg layer 3 (mp3) sound. So you
can use your favorite mp3encoder for the creation of the
sound. The audio can also be a VBR Stream.
MPEG2 is usually a VBR Stream. MPEG2 creation with opti
mizing needs a lot of CPU power. But a film with the dou
ble resolution does NOT is not 4 times larger than an
MPEG1 Stream. Depending on your quality settings it will
be about 1.5 up to 3 times larger than the MPEG1 Stream at
the half resolution.
Audio creation Example
> lav2wav editlist.eli | mp2enc -o sound.mp2
This will fit the MPEG2 quite well. You can save some Bit
when telling to use a lower bitrate (-b option) like 160
or 192 kBit/s
I hope I don't need to explain the usage of an MP3 Encoder
? But you should not use all the fancy options you can
use.
- Video Creation Example
- > lav2yuv editlist.eli | mpeg2enc -f 3 -b 3000 -q 9 -o
- video.m2v
- A very simple example for MPEG2 Video. The most important
option is the -f 3. That tells mpeg2enc that it should
create a MPEG2 stream. Because it is a generic MPEG2 you
have to use the -b bitrate options. And should use the -q
option because you usually want a space saving VBR Stream.
When using VBR Streams the -b option tell mpeg2enc the
maximum bitrate that can be used. The -q option tell
mpeg2enc which quality the streams should have. - > lav2yuv editlist.eli | mpeg2enc -f 3 -4 1 -2 1 -q7 -b 4500 -V 300 -P -g 6 -G 18 -I 1 -o video.m2v
- This is more like a high quality MPEG2 Stream. The -4 1 -2
1 option make a bit better quality. With -b 4500 -q 7 you
tell mpeg2enc the maximal bitrate and the Quality factor.
-V is the video buffer size used for decoding the stream.
For SW playback it can be much higher that the default.
Dynamic GOP set with -g -G, A larger GOP size can help
reduce the bit-rate required for a given quality. The -P
option also ensures that 2 B frames appear between adja
cent I/P frames. The -I 1 option tells mpeg2enc that the
source is a interlaced material like videos. There is time
consuming interlace-adapted motion compensation and block
encoding done. mpeg2enc will switch to this mode if the
size of the frames you encode is larger than the VCD size
for you TV Norm. - If you denoise the images with yuvdenoise and use the
deinterlacing (-F) built in there you should tell mpeg2enc
that it does not need to do motion estimation for inter
laced material. You have to set the mpeg2enc -I 0 option
to tell that the frames are already deinterlaced. This
will save a lot of time when encoding. If you don't do it
it will cause no other drawbacks. - You can also use scaling an options that optimize
(denoise) the images, to get smaller streams. But this
options are explained in deep in the according sections. - Which values should be used for VBR Encoding (-q)
- The -q option controls the minimum quantization of the
output stream. Quantization controls the precision
with which image information is encoded. The higher the
value the better the image quality. - Usually you have to set up a maximum bitrate with the -b
option. So the tricky task is to set a value for the -q
option and the -b option that produces a nice movie with
out using to much bandwidth and not much artefacts. - A Quality factor should be chosen that way that the mplex
output of Peak bit-rate and Average bit-rate differ for
about 20-25%. - If the the difference is very small < 10%, it is very
likely that you have done something wrong. It is very
likely the you have chosen the wrong values for the maxi
mal bitrate or a to high quality factor. - A combination that will produce more artefacts you can
count, is a SVCD with a maximal video bitrate of 2500kBit
and a qualitfactor set to 1 or 2. For SVCD with a video
limit of 2500kBit a quality factor of 7-9 fits quite
good.If you use filter programs or have a very good source
like digital TV, DVD like material or rendered pictures.
If your SVCD/DVD player supports higher bitrates than the
official 2788kBit/sec for the video and audio. Use the
higher bitrate and a higher quality factor, action scenes
for example will look much better. - The same (7-9) quality factor for a full size picture and
a top bitrate of 3500 to 4000 kBit won't produce to much
artefacts too. - For SVCD/DVD you can expect a result like the one
described if the maximal bitrate is not set too low:
q <= 6 real sharp pictures, and good quality
q <= 8 good quality
q <= 10 average quality
q >= 11 not that good
q >= 13 here even still sequences might look blocky - Multiplexing Example
- > mplex -f 3 -b 300 -r 4750 -V audio.mp3 video.mp3 -o final.mpg
- Now both streams are multiplexed, a mp3 audio and a mpeg2
video. You have to use the -f 3 option to tell mplex the
output format. You also have to add the -b decoder buffers
size with the same value used when encoding the video. -r
is that rate of video + audio +1-2% of mplex information.
The -V option tells that your source for mplexing is a VBR
stream. If you don't use this option mplex creates some
thing like a CBR Stream with the bitrate you have told it
with the -r option. An this streams usually get BIG.
CREATING VIDEO-CD'S
VCD is a cut down version of MPEG1 streams. There are
some limitations on VCD's. Like bitrate for video 1152kBit
and for audio layer 2 audio with 224kBit stereo. You are
not allowed to use the -q option, dynamic GOP the video
buffer is limited to 46kB.
The image size is limited to 352x240 for NTSC, and to
352x288 for PAL.
If you have no VCD player, and you plan to play it back on
your DVD player for example. You DVD player might be that
flexible to allow larger bitrates, dynamic GOP, larger
video buffer and so on.
Audio creation Example:
> lav2wav stream.avi | mp2enc -V -o sound.mp2
-V force VCD compatible output (same as: -b 224 -r 44100
-s) For hardware players, you should stick to 44.1 224kBps
Stereo layer 2 Audio.
Video creation Example:
> lav2yuv stream.avi | yuvscaler -O VCD | mpeg2enc -f 1 -r
16 -o video.m1v
For a VCD compatible output the -f 1 sets all options in
mpeg2enc as needed. It seems that many VCD players (Avex
for example) are not able to play MPEG streams that are
encoded with a search radius greater than 16 so do not use
the -r option to override the default of 16.
> lav2yuv streams.eli | mpeg2enc -f 1 -4 1 -2 1 -S 630 -B
260 -P -o video.m1v
Using '-S 630' means that mpeg2enc marks the stream so
that mplex generates a new stream every 630MB. One impor
tant thing is the use of the -B option which specifies the
non-video (audio and mplex information) bitrate. The -B
value of 260 should be fine for audio with 224kBit and
mplex information. For further information take a look at
the encoding scripts in the scripts directory. So the mul
tiplexed streams should easily fit on a CD with 650MB.
The default value (-B) is 700MB for the video. mpeg2enc
marks automatically every stream at that size if the -B
does not set anything else. If you have a CD where you can
write more MB like 800, you have to set the -S option else
mpeg2enc will mark the stream at 700 MB, and mplex will
split the stream there. Which might not be what you want.
Multiplexing Example
> mplex -f 1 sound.mp2 video.m1v -o vcd_out.mpg
The -f 1 option turns on a lot of weird stuff that other
wise has no place in a respectable multiplexer!
Creating the CD: The multiplexed streams have to be con
verted to an VCD compatible. This is done by vcdimager
(http://www.hvrlab.org/~hvr/vcdimager/)
Example:
> vcdimager testvideo.mpg
Creates a videocd.bin, the data file, and a videocd.cue
which is used as control file for cdrdao.
You use cdrdao to burn the image. Cdrdao is yet another
fine Sourceforge
project which is found at: http://cdrdao.sourceforge.net/
For MPEG-1 encoding a typical (45 minute running time)
show or 90 odd minute movie from an analog broadcast a
constant bit-rate of around 1800 kBit/sec should be ideal.
The resulting files are around 700M for 45 minutes which
fits nicely as a raw XA MODE2 data track on a CD-R.
For pure digital sources (DTV or DVD streams and similar)
VCD 1152 works fine.
Note: If you encode VBR MPEG1 (-q) remember the Hardware
was probably not designed to do the playback because it
is not in the specifications. If it works be very happy.
I've notices that it helps when you have an MPEG1 Stream
to tell vcdimager that it is an SVCD. Vcdimager complains
(but only with a warning and not a fatal error)but you
should be able to burn it. This could convince the player
to use an other firmware and play it back correct, but
there is no guarantee for that.
Storing MPEG's. If you record the data as XA mode 2
tracks you can fit appreciably more on a CD (at the
expense of error correction/detection). You can use
vcdimager to do this and vcdxrip (part of the vcdimager
package) to extract ("rip") the resulting files.
For better Quality there are SVCD and XVCD and DVD. Cur
rently only SVCD is fully supported with a pre-set format
in mplex and tools to create disks. MPEG streams that can
be played by DVD player hardware and software can readily
produced using mpeg2enc/mplex but there is currently no
means to make a properly structured disk image.
If your player doesn't support SVCD you may well find it
can handle VCD streams that have much higher than standard
bit-rates. Often as much as 2500kBit/sec is possible. The
AudioVox 1680 for example can handle 2500kBit/s VCD rates
(it also handles VCDs with VBR MPEG-1 but other players
might not be so forgiving).
With higher bit-rates and good quality source material it
is worth trying mpeg2enc's -h flag which produce a stream
that is as sharp as the limits of the VCD standard per
mits. The -h flag seems to help also if there is a low
quality stream. The video does not look that sharp using
the flag but there are not that much glitches as without
it.
However, if your player supports it and you have the
patience for the much longer encoding times SVCD is a much
better alternative. Using a more efficient MPEG format
SVCD more than doubles VCD's resolution while typically
producing files that are rather less than twice as big.
CREATING SVCD'S
Record at full TV resolution (means: -d 1 for PAL this is
720x576)
Audio creation Example:
> lav2wav stream.avi | mp2enc -v -o sound.mp2
NOTE: The SVCD specifications permit a much wider choice
of audio rates, it is not necessary to use 224 kBit/sec.
Any audio rate between 32 and 384 kBit/sec is permitted.
The audio may be VBR (Variable Bit Rate).
Video Creation Example:
> lav2yuv stream.avi | yuvscaler -O SVCD | mpeg2enc -f 4
-q 7 -I 1 -V 200 -o video.m2v
-f 4 sets the options for mpeg2enc to SVCD
-q 7 tell mpeg2enc to generate a variable bitrate stream
-I 1 tell mpeg2enc to assume that the original signal is
field interlaced video where the odd rows of pixels are
sampled a half frame interval after the even ones in each
frame. The -I 0 (progressive output (no field pictures))
option will also work for PAL.
You can use lower bitrates, but the SVCD standard limits
total bit-rate (audio and video) to 2788800 Bit/sec. So
with 224Kbps audio and overheads 2550 may already be
marginally too tight. Since the SVCD format permits any
audio rate between 32 and 224 kBit/sec you can save a few
bits/sec by using 192k audio.
SVCD supports variable bitrate (VBR), because MPEG2 is
usually VBR, but with the top video bitrate limit of
2500kBit/sec. With the -f 4 flag the encoder also sets
dynamic GOP with a low limit of -g 6 and a high limit of
-G 18. This saves a few bits/sec and improves the picture
quality during scene changes.
An other possibility for movies in PAL (European style 25
frames/50 fields per sec) video is:
> lav2yuv stream.avi | yuvscaler -O SVCD | mpeg2enc -f 4
-I 0 -V 300 -o video.m2v
Movies are shot on film at 24 frames/sec. For PAL broad
cast the film is simply shown slightly "too fast" at 25
frame/sec (much to the pain of people with an absolute
pitch sense of pitch). The -I 0 flag turns off the
tedious calculations needed to compensate for field inter
lacing giving much faster encoding.
Unfortunately, movies broadcast in NTSC (US style 30
frames/60 fields sec) video this will produce very poor
compression. The "pulldown" sampling used to produce 60
fields a second from a 24 frame a second movie means half
the frames in an NTSC *are* field interlaced.
For SVCD encoding, you can of course also use yuvscaler
for the downscaling rather than letting mpeg2enc do that.
Don't forget the -S and -B options mentioned above. You
want that the stream fits on the CD don't you ?
Multiplexing Example
> mplex -f 4 -b 300 -r 2750 sound.mp2 video.m2v -o
svcd_out.mpg
-f 4 tells mplex to encode a SVCD,
- -r 2750 is the calculated Audio + Video Bitrate + 1-2%
- multiplex information
- -b 300 is the Buffer aviable on the playback device, the
same used for the video encoding (there the -V
option). - Creating the CD:
- Example:
> vcdimager -t svcd testvideo.mpg - Creates an videocd.bin, the data file, and a videocd.cue
which is used as control file for cdrdao. - Use cdrdao to burn the image as mentioned earlier.
- Note: If you want to build "custom" VCD/SVCD you will need
to use the mplex -f 2 and -f 5 switches. - Note: The VCD SVCD stuff may work on your HW player or
not. There are many reports that it works quite well.
Don't be worried if it does not work. Nor am I responsible
for unusable CDs. ("coasters")
CREATING DIVX VIDEOS
The yuv2divx in the mjpeg tools uses the codecs of the
avifile library to generate videos. The output formats you
can create are dependent on the avifile version you use.
It is recommended that you use at least version 0.6 of
avifile.
(Some distributions come with avifile-0.53, which is no
longer supported by the avifile maintainers.)
The prossesing is a little bit different because the audio
and video files do not need to be multiplexed afterwards.
The output is created in a single pass. You can use the
normal video encoding process. The audio file, or the
sound that is already in the recorded avi, has to be given
yuv2divx as an option. You can specify a WAV file, an
edit list, or, as in this case, the same file we're get
ting the video from.
Enough talk here is an example:
> lav2yuv stream.avi | yuv2divx -A stream.avi -o
lowrate.avi
Looks a bit strange because yuv2divx reads the YUV video
stream from stdin but has the audio passed in by an
option. The -A specifies the audio stream. In this case,
it is also in our stream.avi. The output is also a .avi
file because Divx is also named avi. The .divx extension
is also sometimes used.
Example:
> lav2yuv stream.avi | yuvdenoise | yuvscaler -O
SIZE_640x480 | yuv2divx -b 2500 -a 196 -E DIV5 -A
stream.avi -o output.avi
You see that using other tools to get the stream in the
proper form is no problem. Here we set the maximum
bitrate to 2500kBit/s, and the audio bitrate to 192kBit/s.
The video coded this time used is the DIV5.
A bitrate of 2500 is considered rather high for Divx
encoding. Divx encoding offers its greatest utility (giv
ing decent images at high compression) at bitrates that
MPEG2 encoding would generate poor quality. Experimenta
tion is encouraged, of course, but the general rule of
thumb appears to be that Divx offers similar quality at
two-thirds of the bitrate of MPEG1/2 till a bitrate of
1500kBit. From a bitrate of 1500-2500 kBit the gain of
using Divx (= MPEG-4) compared to MPEG1/2 is getting
smaller. Note that this is video bitrate only, audio
bitrate remains the same as the same type of encoding is
used for both.
lav2divx
If you do not need to perform any audio or video alter
ation of the audio or video streams, you can perform a
conversion to divx in one step using the lav2divx utility.
lav2divx -b 1000 -E DIV5 -o output.avi input.editlist
This takes the edit list and uses that as the source for
both the video and the audio. Since it's all done in one
step, there's no opportunity to use any of the YUV fil
ters, scalers, and denoisers.
A word on avifile codecs
The lav2divx and yuv2divx utilities are primarily intended
for creating Divx avi files. However, since they use avi
file, it's possible to generate output in any video format
avifile is aware of. You specify the codec by its four
letter code ("DIV5" in the examples above; this is some
times called the codec's "fourcc"). The ones that are
available vary greatly depending on the specific libraries
available to avifile.
OPTIMIZING THE STREAM
Using filters helps to increase the image quality using
fixes bitrate video streams. With VBR (variable bit rate)
video the filesize is reduced.
Example:
> lav2yuv stream.avi | yuvmedianfilter | mpeg2enc -o
video.m1v
Here the yuvmedianfilter program is used to improve the
image. This removes some of low frequence noise in the
images. It also sharpens the image a little. It takes a
center pointer avg the pixels around it that fall with the
threshold. It then replaces the center pixel with this new
value. You can also use the -r (radius) option for an
other search radius. Use -t to control the threshold of
the pixel count in the agv. The defaults -r 2 and -t 2
look good.
Example:
> lav2yuv stream.avi | yuvdenoise | mpeg2enc -o video.m1v
Now we are using yuvdenoise to improve the image. The fil
ter mainly reduces color and luminance-noise and flicker
ing due to phase errors.
If you want yuvdenoise also to deinterlace the stream use
the -F option.
Example:
> lav2yuv stream.avi | yuvkineco -F 1 | mpeg2enc -o
video.m1v
yuvkineco is used for NTSC sources. It does the conversa
tion from 29.97 fps to 23.976fps, you can call it "reverse
2-3 pulldown", more info about this in the README.2-3pull
down. yuvkineco does only remove NTSC specific problems.
So if you want to improve the image you should also use
yuvdenoise:
> lav2yuv stream.avi | yuvkineco | yuvdenoise | mpeg2enc
-o video.m1v
- Example:
> lav2yuv stream.avi | yuvycsnoise | mpeg2enc -o video.m1v yuvycsnoise is also used for NTSC and is specialized for
NTSC Y/C separation noise. If video capture hardware has
only a poor Y/C separator then at vertical stripes (espe
cially red/blue) noises appear which seem checker flag and
bright/dark invert per 1 frame. yuvycsnoise reduces noises
of this type. You can also use different thresholds for
luma/chroma and the optimizing method.
yuvycsnoise works only correct when we have NTSC with: - * full height (480 lines)
* full motion captured (29.97 fps)
* captured with poor Y/C separator hardware - For more information about the yuvkineco and yuvycsnoise
read the README in the yuvfilters directory. - If you want to know now the optimal settings for the
denoiser, scaler and so on.Replace the mpeg2enc or
yuv2divx with yuvplay. yuvplay playes back the yuv frames.
So you can see if the options you have choosen are making
the thing better or worse. - A command would look like this:
> lav2yuv stream.eli | yuvdenoise -options | yuvscaler -options | yuvplay
TRANSCODING OF EXISTING MPEG-2 STREAMS
For transcoding existing MPEG-2 streams from digital TV
cards or DVD a still lower data-rate than for broadcast
will give good results. Standard VCD 1152 Kbps typically
works just fine for MPEG1. The difference is in the Sig
nal/Noise ratio of the original. The noise in the analog
stuff makes it much harder to compress.
You will also need to manually adjust the audio delay off
set relative to video when multiplexing. Very often
around 150ms delay seems to do the trick.
You have to download the ac3dec and mpeg2dec packages. You
can find them at mjpeg homepage (http://source
forge.net/projects/mjpeg). You also need sox and toolame
if you want to use the script.
In the scripts directory there is a transcode script that
does most of the work.
So transcoding looks like this:
> transcode -V -o vcd_stream mpeg2src.mpg
- -V : set's the options so that a VCD compatible stream is
- generated
- -o vcd_stream: a vcd_stream.m1v (video) and vcd_stream.mp2 (audio) is created
- mpeg2src.mpg: specifies the source stream
- The script prints also something like this:
> SYNC 234 mSec - You will need to adjust the audio/video startup delays
when multiplexing to ensure audio and video are synchro
nized.
The exact delay (in milliseconds) that you need to pass to
mplex to synchronize audio and video using the "-O" is
printed by the extract_ac3 tool labeled "SYNC" when run
with the "-s" flag. - Then you need to multiplex them like this:
> mplex -f 1 -O 234 vcd_stream.mp2 vcd_stream.m1v -o lowrate.mpg - -f 1 : Mux format is VCD
- -O 234 : Video timestamp offset in mSec, generated by the
lavtrans script, there negative values are
allowed - vcd_stream.mp2 & vcd_stream.m1v : generated files
lowrate.mpg : the VCD compatible output stream - > transcode -S -o svcd_stream mpeg2src.mpg
Here the output format is SVCD (MPEG-2 video). - You have to multiplex it with:
> mplex -f 4 -O 234 svcd_stream.mp2 svcd_stream.m2v -o lowrate.mpg - There is sometimes a problem with NTSC and VCD playback
because movies may be recorded with 3:2 pulldown NTSC with
60 fields/sec. mpeg2dec is designed for playback on com
puters and generates the original 24frames/sec bitrate. If
you encode the video now 30frames/sec video is created.
This video is now much too short for the encoded audio.
The transcoding can be made to work but it must be done
manually: - > cat mpeg2src.mpg | mpeg2dec -s -o YUVs | mpeg2enc -I 0 -f 4 -q 9 -V 200 -b 2500 -p -o svcd_stream.m2v
- The -p tells mpeg2enc to generate header flags for 32 pull
down of 24fps movie. It may also work if you do not add
the -p flag. - You do not need the -p flag when transcoding to VCD format
because it is not supported in mpeg1. - If you want to do every step on your own it has to look
like this: - Extracting Audio:
> cat test2.mpg | extract_ac3 - -s | ac3dec -o wav -p sound.wav 2>/dev/null - One of the first lines showed contains the label "SYNC"
you have to use this time afterwards for the multiplexing.
The 2>/dev/null redirects the output of ac3dec to
/dev/null. In the next step you generate the mpeg audio
file: - > cat sound.wav | mp2enc -V -v 2 -o audio.mp2
- -V : forces VCD format, the sampling rate is converted to
44.1kHz from 48kHz - -v 2: unnecessary but if you use it mp2enc tells you how
many seconds of the Audio file are already encoded. - Specifies the output file.
- The other version uses sox and toolame in a singe command:
> cat test2.mpg | extract_ac3 - -s | ac3dec -o wav | sox -t wav /dev/stdin -t wav -r 44100 /dev/stdout | toolame -p 2 -b 224 /dev/stdin audio.mp2 - One of the first lines output contains the label "SYNC".
You have to use this time (referred to as "SYNC_value"
below) when doing the multiplexing. - You can generate VCD and SVCD videos, and own mpeg1/2
videos. - For VCD creation use:
- > cat test2.mpg | mpeg2dec -s -o YUVh | mpeg2enc -f 1 -o video_vcd.m1v
- mpeg2dec:
- -f 1 :
tells mpeg2dec to use program stream demultiplexer - -o YUVh : the output size of the extracted frames
- here are other output modes, try "mpeg2dec --help" but the
most important here are: - YUV : is the full image size
- YUVs : is SVCD size
- YUVh : is VCD size
- Mplex with:
> mplex -f 1 -O SYNC_value audio.mp2 video_vcd.m1v -o vcd_stream.mpg - -f 1 : generates an VCD stream
- For SVCD creation use:
> cat test2.mpg | mpeg2dec -s -o YUVs | mpeg2enc -f 4 -q 9 -V 200 -o video_svcd.mpg - -f 4 : Set options for MPEG 2 SVCD
- -q 9 : Quality factor for the stream (VBR stream)
(default q: 12) - -V 200 : Target video buffer size in KB
- -o : Output file
- Mplex with:
> mplex -f 4 -b 200 -r 2755 audio.mp2 video_svcd -o svcd_stream.mpg - -f 4 : generate an SVCD stream
- -b 200 : Specify the video buffer also used while video encoding
- -r 2755:
- Specify data rate of output stream in kbit/sec
- For other video output formats this might work:
> cat test2.mpg | mpeg2dec -s -o YUV | yuvscaler -O SIZE_320x200 -O NOT_INTERLACED | mpeg2enc -o strange_video.m1v - If you want to reedit mpeg streams, this also works, but
in a slightly different way. For demultiplexing you can
use bbdmux, from the bbtools package. Splits out either
video or audio very cleanly. Look for the linux port at
the bottom.
Available at: http://members.home.net/beyeler/bbmpeg.html - First run:
> bbdmux myvideo.mpg - You should get something like this:
Found stream id 0xE0 = Video Stream 0
Found stream id 0xC0 = MPEG Audio Stream 0
Found stream id 0xBE = Padding Stream - Extract audio with:
> bbdmux myvideo.mpg 0xC0 audio.mp1 - Convert it to wav:
> mpg123 -w audio.wav audio.m1v - Extract video with:
> bbdmux myvideo.mpg 0xE0 video.m1v - Converting video to an mjpeg avi stream:
> cat video.m1v | mpeg2dec -o YUV | yuv2lav -f a -o test.avi - Then adding the sound to the avi:
> lavaddwav test.avi audio.wav final.avi - If the source video has already the size of the target
video use -o YUV. Using YUVh makes the video the half
size! - The rest can be done just like editing and encoding other
streams. - If you have videos with ac3 sound you only have to adapt
the commands above. - Extracting Audio:
> cat test2.mpg | extract_ac3 - -s | ac3dec -o wav 2>/dev/null >sound.wav - Extract video:
> cat test2.mpg | mpeg2dec -s -o YUVh | yuv2lav -f a -q 85 -o test.avi - Adding the sound:
> lavaddwav test.avi sound.wav fullvideo.avi - NOTE: You need much disk space. 1GB of video has a size of
about 2GB at SVCD format and of course space is needed for
some temp files. Converting the video to mjpeg also takes
some time. - On my Athlon 500 I never get more than 6-7 Frames a sec
ond.
You loose quality each time you convert a stream into an
other format !
TRADING QUALITY/SPEED
If absolute quality is your objective a modest improvement
can be achieved using the -4 and -2 flags. These control
how ruthlessly mpeg2enc discards bad looking matches
between sections of adjacent frames during the early
stages of the search when it is working with 4*4 and 2*2
clusters of pixels rather than individual pixels. Setting
-4 1 -2 1 maximizes quality. -4 4 -2 4 maximizes speed.
Note that because the statistical criteria mpeg2enc uses
for discarding bad looking matches are usually fairly
reliable the increase/decrease in quality is modest (but
noticeable).
Reducing the radius of the search for matching sections of
images also increases speed. However due to the way the
search algorithm works the search radius is in effect
rounded to the nearest multiple of 8. Furthermore, on mod
ern CPU's the speed gained by reducing the radius below 16
is not large enough to make the marked quality reduction
worthwhile for most applications.
Creating streams to be played from disk using Software
players
Usually MPEG player software is much more flexible than
the hardware built into DVD and VCD players. This flexi
bility allows for significantly better compression to be
achieved for the same quality. The trick is to generate
video streams that use big video buffers (500KB or more)
and variable bit-rate encoding (the -f, -q flag to
mpeg2enc). Software players will often also correctly play
back the much more efficient MPEG layer 3 (yes, "MP3")
audio format. A good Mp3 encoder like lame will produce
results comparable to layer 2 at 224Kbps at 128Kbps or
160Kbps.
SMP AND DISTRIBUTED ENCODING
The degree to which mpeg2enc tries to split work between
concurrently executing threads is controlled by the -M
oder --multi-thread [0..32] option. This optimizes
mpeg2enc for the specified number of CPUs. By default (-M
1), mpeg2enc runs with just a little multi-threading:
reading of frames happens concurrently with compression.
This is done to allow encoding pipelines that are split
across several machines (see below) to work efficiently
without the need for special buffering programs.
If you are encoding on a single-CPU machine where RAM is
tight you may find turning off multithreading altogether
by setting -M 0 works slightly more efficiently.
For SMP machines with two ore more processors you can
speed up mpeg2enc by setting the number of concurrently
executing encoding threads's you wish to utilize (e.g. -M
2). Setting -M 2 or -M 3 on a 2-way machine should allow
you to speed up encoding by around 80%.
Obviously, if your encoding pipeline contains several fil
tering stages it is likely that you can keep two or more
CPU's busy simultaneously even without using -M. Denoising
using yuvdenoise is particular demanding and uses almost
as much processing power as MPEG encoding.
It you more than one computer you can also split the
encoding pipeline between computers using the standard
"rsh" or "rcmd" remote shell execution commands. For
example, if you have two computers:
> rsh machine1 lav2yuv mycapture.eli | yuvscaler -O SVCD yuvdenoise | mpeg2enc -f 4 -o mycapture.m2v
Here the computer where you execute the command is doing
the MPEG encoding whilst "machine1" is the machine that is
decoding scaling and denoising the captured video.
Obviously, for this to work "machine1" has to be able to
access the video and the computer where the command is
executed has to have space for the encoded video. In prac
tice, it is usually well worth setting up network filestorage using "NFS" or other packages if you are going to
do stuff like this. If you have three computers you can
take this a stage further, one computer could do the
decoding and scaling, the next could do denoising and the
third could do MPEG encoding:
> rsh machine1 lav2yuv mycapture.eli | yuvscaler -O SVCD yuvdenoise | rsh machine3 mpeg2enc -f 4 -o mycapture.m2v
Note how the remote command executions are set up so that
the data is sent direct from the machine that produces it
to the machine that consumes it.
In practice for this to be worthwhile the network you are
using must be fast enough to avoid becoming a bottleneck.
For Pentium-III class machines or above you will need a
100Mbps Ethernet. For really fast machines a switched
100MBps Ethernet (or better!) may be needed.Setting up the
rshd ("Remote SHell Daemon") needed for rsh to do its work
and configuring "rsh" is beyond the scope of this docu
ment, but its a standard package and should be easily
installed and activated on any Linux or BSD distribution.
Be aware that this is potentially a security issue so use
with care on machines that are visible to outside net
works!
INTEROPERABILITY
Quicktime files capturing using lavrec can be edited using
Broadcast2000. mjpeg AVI files captured using the
streamer tool from the xawtv package can be edited and
compressed and played back using software. Hardware play
back is not possible for such files due to limitations in
the Zoran hardware currently supported.
MPEG files produced using the tools are know to play back
correctly on:
dxr2 (hardware decoder card)
mtv MPEG1 only
xine
oms
dvdview
xmovie
gtv MPEG1 only
mplayer
vlc
ztheater
MS Media player version 6 and 7
SW DVD Player
It seems that the MS Media player likes MPEG-1 streams
more if you have used -f 1 when multiplexing.
FILES
/usr/local/bin
There you find the files after the install of the package,
or a make install for a tar or a cvs download
ENVIRONMENT VARIABLES
- LAV_VIDEO_DEV
- Specifies the video device used by the mjpeg tools
- LAV_AUDIO_DEV
Specifies the audio device used by the mjpeg tools - LAV_MIXER_DEV
Specifies the mixer device used by the mjpeg tools - MJPEG_DROP_FRAME_TIME_CODE
If "1" set, display drop-frame timecode for NTSC
input, instead of non-drop-frame timecode displayed
in default. This affects to glav, lavplay, lavrec,
yuvplay, yuvkineco.
AUTHORS
If you have any problems or suggestions feel free to mail
me (Bernhard Praschinger): waldviertler@users.source
forge.net
There is a lot of stuff added from the HINTS which Andrew
Stevens (andrew.stevens@nexgo.de) created.
And there a some people that helped me with program
descriptions and hints,
thanks
- If you have questions, remarks, problems or you just want
to contact the developers, the main mailing list for the
MJPEG-tools is: - mjpeg-users@lists.sourceforge.net
- Although little bits have been done by everyone the main
work was roughly as follows: - lav* : Ronald Bultje <rbultje@ronald.bitfreak.net>, Gernot
Ziegler <gz@lysator.liu.se>
mpeg2enc mplex bits-and-pieces : andrew.stevens@nexgo.de
libmjpeg, libmovtar: Gernot Ziegler <gz@lysator.liu.se> - Many thanks and Kudos to Rainer Johanni the original
author who started this all and did most of the hard work
in the lavtools.
SEE ALSO
The mjpeg homepage is at:
http://mjpeg.sourceforge.net/
http://sourceforge.net/projects/mjpeg
vcdimager is aviable at:
http://www.hvrlab.org/~hvr/vcdimager/
cdrdao is aviable at:
http://cdrdao.sourceforge.net/index.html
Linux Video Studio is aviable at:
http://ronald.bitfreak.net
The lavtools:
jpeg2yuv(1), lav2wav(1), lav2yuv(1), lavpipe(1), lav
play(1), lavrec(1), lavtrans(1), mp2enc(1), mpeg2enc(1),
mplex(1), ppmtoy4m(1), yuv2lav(1), yuvdenoise(1),
yuvkineco(1), yuvmedianfilter(1), yuvplay(1), yuvs
caler(1), yuvycsnoise(1), y4mcolorbars(1), y4mtoppm(1).
- Tools without a man page: lavaddwaw, glav