view DOCS/tech/encoding-guide.txt @ 31525:dd2b64511f05

Move dvd_speed extern variable declaration from stream_dvd_common.h to stream.h. All other dvd_ extern variable declarations are there already and this avoids #ifdefs around an #include of stream_dvd_common.h in cfg-common.h, which would be necessary because stream_dvd_common.h contains dvdread #includes.
author diego
date Wed, 30 Jun 2010 10:09:19 +0000
parents 13061a6174b6
children
line wrap: on
line source

Topics:


I. Preparing to encode
   1. Identifying source material and framerate
   2. Selecting the quality you want
   3. Constraints for efficient encoding
   4. Cropping and scaling
   5. Choosing resolution and bitrate

II. Containers and codecs
   1. Where the movie will be played
   2. Constraints of DVD, SVCD, and VCD
   3. Limitations of AVI container

III. Basic MEncoder usage
   1. Selecting codecs & format
   2. Selecting input file or device
   3. Loading video filters
   4. Notes on A/V sync

IV. Encoding procedures
   1. Encoding progressive video
   2. Two-pass encoding
   3. Encoding interlaced video
   4. Deinterlacing
   5. Inverse telecine
   6. Capturing TV input
   7. Dealing with mixed-source content
   8. Low-quality & damaged sources

V. Optimizing encoding quality
   1. Noise removal
   2. Pure quality-gain options
   3. Questionable-gain options
   4. Advanced MPEG-4 features




II. Containers and codecs

II.1. Where the movie will be played

Perhaps the most important factor to choosing the format in which you
will encode your movie is where you want to be able to play it.
Usually this involves a tradeoff between quality and features, since
the formats supported by the widest variety of players are also the
worst in regards to compression.

If you want to be able to play your encode on standalone/set-top
players, your primary choices are DVD, VCD, and SVCD. There are also
extensions such as KVCD and XVCD which violate the standards but work
on many players and deliver higher quality. Modern players are
beginning to support MPEG-4 ("DivX") movies in AVI and perhaps other
containers as well, but these are often buggy and require you to
restrict your encodes to certain subsets of the full MPEG-4
functionality.

If you wish to be able to share your movies with Windows or Macintosh
users, without them having to install additional software, your
choices are very limited. The ancient MPEG-1 format with MP2 or PCM
audio is probably the only choice that is universally supported.
Interoperability with Windows/Mac also comes into play when deciding
how to encode and whether to scale to preserve aspect, since popular
media player applications for these systems do not honor the aspect
ratio encoding stored in MPEG-4 avi files.



IV.2. Two-pass encoding

The complexity (and thus the number of bits) required to compress the
frames of a movie can vary greatly from one scene to another. Modern
video encoders can adjust to these needs as they go and vary the
bitrate. However, they cannot exceed the requested average bitrate for
long stretches of time, because they do not know the bitrate needs of
future scenes.

Two-pass encoding solves this problem by encoding the movie twice.
During the first pass, statistics are generated regarding the number
of bits used by each frame and the quantization level (quality) at
which it was encoded. Then, when the second pass begins, the encoder
reads these statistics and redistributes the bits from frames where
they are in excess to frames that are suffering from low quality.

In order for the process to work properly, the encoder should be given
exactly the same sequence of frames during both passes. This means
that the same filters must be used, the same encoder parameters must
be used (with the possible exception of bitrate), and the same frame
drops and duplications (if any) must take place.

In theory it's possible to use -oac pcm or -oac copy during the first
pass to avoid spending time encoding the audio. However, this can
result in slight variations in which frames get dropped or duplicated,
so it may be preferable to encode the audio during the first pass as
well as the second. This also allows you to examine the final audio
bitrate and filesize, and to adjust the audio or video bitrate
slightly between passes if you don't meet your target size.

Here is an example:

  Encoding from an existing AVI file
  500 kbit/sec MPEG-4 video
  96 kbit/sec average-bitrate MP3 audio

  mencoder bar.avi -vf scale=448:336 -mc 0 -oac mp3lame -lameopts \
  abr:br=96 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500:vpass=1

  mencoder bar.avi -vf scale=448:336 -mc 0 -oac mp3lame -lameopts \
  abr:br=96 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500:vpass=2

If you do not want to overwrite the output from the first pass when
you begin the second, you can use the -o option to choose a different
output filename. Note the addition of the vpass option in this
example. If vpass is not specified, single-pass encoding is performed.
If vpass=1, a log file is written with statistics from the first pass.
If vpass=2, the log file is read and the second pass is encoded based
on those statistics. If you are short on disk space or don't want the
extra disk wear from writing the file twice, you can use -o /dev/null
during the first pass. However, sometimes it is beneficial to watch
the first-pass file before beginning the second pass to make sure
nothing went wrong in the encoding.

Next, an example using Xvid instead of libavcodec:

  Encoding from an existing AVI file
  500 kbit/sec MPEG-4 video
  Copying the existing audio stream unmodified

  mencoder foo.avi -vf scale=320:240 -mc 0 -oac copy -ovc xvid \
  -xvidencopts bitrate=400:pass=1

  mencoder foo.avi -vf scale=320:240 -mc 0 -oac copy -ovc xvid \
  -xvidencopts bitrate=400:pass=2

The options used are slightly different, but the process is otherwise
the same.