mirror of https://github.com/mpv-player/mpv
1489 lines
56 KiB
XML
1489 lines
56 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!-- $Revision$ -->
|
|
<chapter id="mencoder">
|
|
<title>Encoding with <application>MEncoder</application></title>
|
|
|
|
<para>
|
|
For the complete list of available <application>MEncoder</application> options
|
|
and examples, please see the man page. For a series of hands-on examples and
|
|
detailed guides on using several encoding parameters, read the
|
|
<ulink url="../../tech/encoding-tips.txt">encoding-tips</ulink> that were
|
|
collected from several mailing list threads on mplayer-users. Search the
|
|
<ulink url="http://mplayerhq.hu/pipermail/mplayer-users/">archives</ulink>
|
|
for a wealth of discussions about all aspects of and problems related to
|
|
encoding with <application>MEncoder</application>.
|
|
</para>
|
|
|
|
<sect1 id="menc-feat-mpeg4">
|
|
<title>Encoding 2-pass MPEG4 ("DivX")</title>
|
|
|
|
<para>
|
|
The name comes from the fact that this method encodes the file <emphasis>twice</emphasis>.
|
|
The first encoding (dubbed pass) creates some temporary files
|
|
(<filename>*.log</filename>) with a size of few megabytes, do not delete
|
|
them yet (you can delete the AVI). In the second pass, the 2-pass output
|
|
file is created, using the bitrate data from the temporary files. The
|
|
resulting file will have much better image quality. If this is the first
|
|
time you heard about this, you should consult some guides available on the
|
|
net.
|
|
</para>
|
|
|
|
<example>
|
|
<title>copy audio track</title>
|
|
<para>
|
|
2-pass encode of a DVD to an MPEG4 ("DivX") AVI while copying
|
|
the audio track.
|
|
<screen>
|
|
mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -oac copy -o <replaceable>movie.avi</replaceable>
|
|
mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=2 -oac copy -o <replaceable>movie.avi</replaceable>
|
|
</screen>
|
|
</para>
|
|
</example>
|
|
|
|
<example>
|
|
<title>encode audio track</title>
|
|
<para>
|
|
2-pass encode of a DVD to an MPEG4 ("DivX") AVI while encoding
|
|
the audio track to MP3.
|
|
<screen>
|
|
mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -oac mp3lame -lameopts vbr=3 -o <replaceable>movie.avi</replaceable>
|
|
mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=2 -oac mp3lame -lameopts vbr=3 -o <replaceable>movie.avi</replaceable>
|
|
</screen>
|
|
</para>
|
|
</example>
|
|
</sect1>
|
|
|
|
<sect1 id="menc-feat-mpeg">
|
|
<title>Encoding to MPEG format</title>
|
|
<para>
|
|
<application>MEncoder</application> can create MPEG (MPEG-PS) format output
|
|
files. It's probably useful only with
|
|
<link linkend="ffmpeg"><systemitem class="library">libavcodec</systemitem></link>'s
|
|
<emphasis>mpeg1video</emphasis> codec, because players - except
|
|
<application>MPlayer</application> - expect MPEG1 video, and MPEG1 layer 2 (MP2)
|
|
audio streams in MPEG files.
|
|
</para>
|
|
|
|
<para>
|
|
This feature is not very useful right now, aside that it probably has many bugs,
|
|
but the more importantly because <application>MEncoder</application> currently
|
|
cannot encode MPEG1 layer 2 (MP2) audio, which all other players expect in MPEG files.
|
|
</para>
|
|
|
|
<para>
|
|
To change <application>MEncoder</application>'s output file format,
|
|
use the <option>-of mpeg</option> option.
|
|
</para>
|
|
|
|
<para>
|
|
Example:
|
|
<screen>
|
|
mencoder -of mpeg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy <replaceable>other_options</replaceable> <replaceable>media.avi</replaceable> -o <replaceable>output.mpg</replaceable>
|
|
</screen>
|
|
</para>
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="menc-feat-rescale">
|
|
<title>Rescaling movies</title>
|
|
|
|
<para>
|
|
Often the need to resize movie images' size emerges. Its reasons can be
|
|
many: decreasing file size, network bandwidth,etc. Most people even do
|
|
rescaling when converting DVDs or SVCDs to DivX AVI. If you wish to rescale,
|
|
read the <link linkend="aspect">Preserving aspect ratio</link> section.
|
|
</para>
|
|
|
|
<para>
|
|
The scaling process is handled by the <literal>scale</literal> video filter:
|
|
<option>-vf scale=<replaceable>width</replaceable>:<replaceable>height</replaceable></option>.
|
|
Its quality can be set with the <option>-sws</option> option.
|
|
If it's not specified, <application>MEncoder</application> will use 0: fast
|
|
bilinear.
|
|
</para>
|
|
|
|
<para>
|
|
Usage:
|
|
<screen>
|
|
mencoder <replaceable>input.mpg</replaceable> -ovc lavc -lavcopts vcodec=mpeg4 -vf scale=640:480 -o <replaceable>output.avi</replaceable>
|
|
</screen>
|
|
</para>
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="menc-feat-streamcopy">
|
|
<title>Stream copying</title>
|
|
|
|
<para>
|
|
<application>MEncoder</application> can handle input streams in two ways:
|
|
<emphasis role="bold">encode</emphasis> or <emphasis role="bold">copy</emphasis>
|
|
them. This section is about <emphasis role="bold">copying</emphasis>.
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
<listitem><para>
|
|
<emphasis role="bold">Video stream</emphasis> (option <option>-ovc copy</option>):
|
|
nice stuff can be done :) Like, putting (not converting!) FLI or VIVO or
|
|
MPEG1 video into an AVI file! Of course only
|
|
<application>MPlayer</application> can play such files :) And it probably
|
|
has no real life value at all. Rationally: video stream copying can be
|
|
useful for example when only the audio stream has to be encoded (like,
|
|
uncompressed PCM to MP3).
|
|
</para></listitem>
|
|
<listitem><para>
|
|
<emphasis role="bold">Audio stream</emphasis> (option <option>-oac copy</option>):
|
|
straightforward. It is possible to take an external audio file (MP3,
|
|
WAV) and mux it into the output stream. Use the
|
|
<option>-audiofile <replaceable>filename</replaceable></option> option
|
|
for this.
|
|
</para></listitem>
|
|
</itemizedlist>
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="menc-feat-fix-avi">
|
|
<title>Fixing AVIs with broken index or interleaving</title>
|
|
|
|
<para>
|
|
Easiest thing. We simply copy the video and audio streams, and
|
|
<application>MEncoder</application> generates the index. Of course this cannot fix possible bugs in
|
|
the video and/or audio streams. It also fixes files with broken interleaving,
|
|
thus the <option>-ni</option> option won't be needed for them anymore.
|
|
</para>
|
|
|
|
<para>
|
|
Command:
|
|
<screen>
|
|
mencoder -idx <replaceable>input.avi</replaceable> -ovc copy -oac copy -o <replaceable>output.avi</replaceable><!--
|
|
--></screen>
|
|
</para>
|
|
|
|
|
|
<sect2 id="menc-feat-appending">
|
|
<title>Appending multiple AVI files</title>
|
|
|
|
<para>
|
|
As a side-effect, the broken AVI fixer function enables <application>MEncoder</application>
|
|
to append 2 (or more) AVI files:
|
|
</para>
|
|
|
|
<para>
|
|
Command:
|
|
<screen>cat <replaceable>1.avi</replaceable> <replaceable>2.avi</replaceable> > <replaceable>3.avi</replaceable>
|
|
mencoder -noidx -ovc copy -oac copy -o <replaceable>output.avi</replaceable> <replaceable>3.avi</replaceable></screen>
|
|
</para>
|
|
|
|
<note><para>
|
|
This expects <filename>1.avi</filename> and <filename>2.avi</filename> to use
|
|
the same codecs, resolution, stream rate etc, and at least <filename>1.avi</filename>
|
|
must not be broken. You may need to fix your input AVI files first, as described
|
|
<link linkend="menc-feat-fix-avi">above</link>.
|
|
</para></note>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="menc-feat-enc-libavcodec">
|
|
<title>Encoding with the <systemitem class="library">libavcodec</systemitem>
|
|
codec family</title>
|
|
|
|
<para>
|
|
<link linkend="ffmpeg"><systemitem class="library">libavcodec</systemitem></link>
|
|
provides simple encoding to a lot of interesting video and audio formats.
|
|
You can encode to the following codecs (more or less up to date):
|
|
|
|
<informaltable frame="all">
|
|
<tgroup cols="2">
|
|
<thead>
|
|
<row><entry>Codec name</entry><entry>Description</entry></row>
|
|
</thead>
|
|
<tbody>
|
|
<row><entry>mjpeg</entry><entry>
|
|
Motion JPEG
|
|
</entry></row>
|
|
<row><entry>ljpeg</entry><entry>
|
|
Lossless JPEG
|
|
</entry></row>
|
|
<row><entry>h263</entry><entry>
|
|
H.263
|
|
</entry></row>
|
|
<row><entry>h263p</entry><entry>
|
|
H.263+
|
|
</entry></row>
|
|
<row><entry>mpeg4</entry><entry>
|
|
ISO standard MPEG4 (DivX 5, XVID compatible)
|
|
</entry></row>
|
|
<row><entry>msmpeg4</entry><entry>
|
|
pre-standard MPEG4 variant by MS, v3 (aka DivX3)
|
|
</entry></row>
|
|
<row><entry>msmpeg4v2</entry><entry>
|
|
pre-standard MPEG4 by MS, v2 (used in old asf files)
|
|
</entry></row>
|
|
<row><entry>wmv1</entry><entry>
|
|
Windows Media Video, version 1 (aka WMV7)
|
|
</entry></row>
|
|
<row><entry>wmv2</entry><entry>
|
|
Windows Media Video, version 2 (aka WMV8)
|
|
</entry></row>
|
|
<row><entry>rv10</entry><entry>
|
|
an old RealVideo codec
|
|
</entry></row>
|
|
<row><entry>mpeg1video</entry><entry>
|
|
MPEG1 video
|
|
</entry></row>
|
|
<row><entry>mpeg2video</entry><entry>
|
|
MPEG2 video
|
|
</entry></row>
|
|
<row><entry>huffyuv</entry><entry>
|
|
lossless compression
|
|
</entry></row>
|
|
<row><entry>asv1</entry><entry>
|
|
ASUS Video v1
|
|
</entry></row>
|
|
<row><entry>asv2</entry><entry>
|
|
ASUS Video v2
|
|
</entry></row>
|
|
<row><entry>ffv1</entry><entry>
|
|
FFmpeg's lossless video codec
|
|
</entry></row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
The first column contains the codec names that should be passed after the
|
|
<literal>vcodec</literal> config, like: <option>-lavcopts vcodec=msmpeg4</option>
|
|
</para>
|
|
|
|
<informalexample>
|
|
<para>
|
|
An example, with MJPEG compression:
|
|
<screen>mencoder dvd://2 -o title2.avi -ovc lavc -lavcopts vcodec=mjpeg -oac copy</screen>
|
|
</para>
|
|
</informalexample>
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="menc-feat-enc-images">
|
|
<title>Encoding from multiple input image files (JPEG, PNG, TGA, SGI)</title>
|
|
|
|
<para>
|
|
<application>MEncoder</application> is capable of creating movies from one
|
|
or more JPEG, PNG or TGA files. With simple framecopy it can create MJPEG
|
|
(Motion JPEG), MPNG (Motion PNG) or MTGA (Motion TGA) files.
|
|
</para>
|
|
|
|
<orderedlist>
|
|
<title>Explanation of the process:</title>
|
|
<listitem><para>
|
|
<application>MEncoder</application> <emphasis>decodes</emphasis> the input image(s) with
|
|
<systemitem class="library">libjpeg</systemitem> (when decoding PNGs, it
|
|
will use <systemitem class="library">libpng</systemitem>).
|
|
</para></listitem>
|
|
<listitem><para>
|
|
<application>MEncoder</application> then feeds the decoded image to the
|
|
chosen video compressor (DivX4, XviD, FFmpeg msmpeg4, etc.).
|
|
</para></listitem>
|
|
</orderedlist>
|
|
|
|
<formalpara>
|
|
<title>Examples</title>
|
|
<para>
|
|
The explanation of the <option>-mf</option> option is in the man page.
|
|
|
|
<informalexample>
|
|
<para>
|
|
Creating an MPEG4 file from all the JPEG files in the current directory:
|
|
<screen>
|
|
mencoder mf://*.jpg -mf type=jpg:w=800:h=600:fps=25 -ovc lavc -lavcopts vcodec=mpeg4 -oac copy -o <replaceable>output.avi</replaceable>
|
|
</screen>
|
|
</para>
|
|
</informalexample>
|
|
|
|
<informalexample>
|
|
<para>
|
|
Creating an MPEG4 file from some JPEG files in the current directory:
|
|
<screen>
|
|
mencoder mf://<replaceable>frame001.jpg,frame002.jpg</replaceable> -mf type=jpg:w=800:h=600:fps=25 -ovc lavc -lavcopts vcodec=mpeg4 -oac copy -o <replaceable>output.avi</replaceable>
|
|
</screen>
|
|
</para>
|
|
</informalexample>
|
|
|
|
<informalexample>
|
|
<para>
|
|
Creating a Motion JPEG (MJPEG) file from all the JPEG files in the current
|
|
directory:
|
|
<screen>
|
|
mencoder mf://*.jpg -mf type=jpg:w=800:h=600:fps=25 -ovc copy -oac copy -o <replaceable>output.avi</replaceable>
|
|
</screen>
|
|
</para>
|
|
</informalexample>
|
|
|
|
<informalexample>
|
|
<para>
|
|
Creating an uncompressed file from all the PNG files in the current directory:
|
|
<screen>
|
|
mencoder mf:// -mf w=800:h=600:fps=25:type=png -ovc raw -oac copy -o <replaceable>output.avi</replaceable>
|
|
</screen>
|
|
</para>
|
|
</informalexample>
|
|
|
|
<note><para>
|
|
Width must be integer multiple of 4, it's a limitation of the RAW RGB AVI format.
|
|
</para></note>
|
|
|
|
<informalexample>
|
|
<para>
|
|
Creating a Motion PNG (MPNG) file from all the PNG files in the current
|
|
directory:
|
|
<screen>
|
|
mencoder mf://*.jpg -mf w=800:h=600:fps=25:type=png -ovc copy -oac copy -o <replaceable>output.avi</replaceable> <!--
|
|
--></screen>
|
|
</para>
|
|
</informalexample>
|
|
|
|
<informalexample>
|
|
<para>
|
|
Creating a Motion TGA (MTGA) file from all the TGA files in the current
|
|
directory:
|
|
<screen>
|
|
mencoder mf://*.tga -mf w=800:h=600:fps=25:type=tga -ovc copy -oac copy -o <replaceable>output.avi</replaceable><!--
|
|
--></screen>
|
|
</para>
|
|
</informalexample>
|
|
|
|
</para>
|
|
</formalpara>
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="menc-feat-extractsub">
|
|
<title>Extracting DVD subtitles to VOBsub file</title>
|
|
|
|
<para>
|
|
<application>MEncoder</application> is capable of extracting subtitles from
|
|
a DVD into VOBsub formatted files. They consist of a pair of files ending in
|
|
<filename>.idx</filename> and <filename>.sub</filename> and are usually
|
|
packaged in a single <filename>.rar</filename> archive.
|
|
<application>MPlayer</application> can play these with the
|
|
<option>-vobsub</option> and <option>-vobsubid</option> options.
|
|
</para>
|
|
|
|
<para>
|
|
You specify the basename (i.e without the <filename>.idx</filename> or
|
|
<filename>.sub</filename> extension) of the output files with
|
|
<option>-vobsubout</option> and the index for this subtitle in the
|
|
resulting files with <option>-vobsuboutindex</option>.
|
|
</para>
|
|
|
|
<para>
|
|
If the input is not from a DVD you should use <option>-ifo</option> to
|
|
indicate the <filename>.ifo</filename> file needed to construct the
|
|
resulting <filename>.idx</filename> file.
|
|
</para>
|
|
|
|
<para>
|
|
If the input is not from a DVD and you do not have the
|
|
<filename>.ifo</filename> file you will need to use the
|
|
<option>-vobsubid</option> option to let it know what language id to put in
|
|
the <filename>.idx</filename> file.
|
|
</para>
|
|
|
|
<para>
|
|
Each run will append the running subtitle if the <filename>.idx</filename>
|
|
and <filename>.sub</filename> files already exist. So you should remove any
|
|
before starting.
|
|
</para>
|
|
|
|
<example>
|
|
<title>Copying two subtitles from a DVD while doing 2-pass encoding</title>
|
|
<screen>
|
|
rm subtitles.idx subtitles.sub
|
|
mencoder dvd://1 -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -vobsubout subtitles -vobsuboutindex 0 -sid 2
|
|
mencoder dvd://1 -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vpass=2 -vobsubout subtitles -vobsuboutindex 1 -sid 5<!--
|
|
--></screen>
|
|
</example>
|
|
|
|
<example>
|
|
<title>Copying a french subtitle from an MPEG file</title>
|
|
<screen>
|
|
rm subtitles.idx subtitles.sub
|
|
mencoder <replaceable>movie.mpg</replaceable> -ifo <replaceable>movie.ifo</replaceable> -vobsubout subtitles -vobsuboutindex 0 -vobsuboutid fr -sid 1<!--
|
|
--></screen>
|
|
</example>
|
|
|
|
</sect1>
|
|
|
|
<sect1 id="aspect">
|
|
<title>Preserving aspect ratio</title>
|
|
<para>
|
|
DVDs and SVCDs (i.e. MPEG1/2) files contain an aspect ratio value, which
|
|
describes how the player should scale the video stream, so humans won't
|
|
have egg heads (ex.: 480x480 + 4:3 = 640x480). However when encoding to AVI
|
|
(DivX) files, you have be aware that AVI headers don't store this value.
|
|
Rescaling the movie is disgusting and time consuming, there has to be a better
|
|
way!
|
|
</para>
|
|
|
|
<para>There is</para>
|
|
|
|
<para>
|
|
MPEG4 has an unique feature: the video stream can contain its needed aspect
|
|
ratio. Yes, just like MPEG1/2 (DVD, SVCD) and H.263 files. Regretfully, there are
|
|
<emphasis role="bold">no</emphasis> video players outside which support this
|
|
attribute of MPEG4, except <application>MPlayer</application>.
|
|
</para>
|
|
|
|
<para>
|
|
This feature can be used only with
|
|
<link linkend="ffmpeg"><systemitem class="library">libavcodec</systemitem></link>'s
|
|
<systemitem>mpeg4</systemitem> codec. Keep in mind: although
|
|
<application>MPlayer</application> will correctly play the created file,
|
|
other players will use the wrong aspect ratio.
|
|
</para>
|
|
|
|
<para>
|
|
You seriously should crop the black bands over and below the movie image.
|
|
See the man page for the usage of the <systemitem>cropdetect</systemitem> and
|
|
<systemitem>crop</systemitem> filters.
|
|
</para>
|
|
|
|
<para>
|
|
Usage
|
|
<screen>mencoder <replaceable>sample-svcd.mpg</replaceable> -ovc lavc -lavcopts vcodec=mpeg4:autoaspect -vf crop=714:548:0:14 -oac copy -o <replaceable>output.avi</replaceable></screen>
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="custommatrices"><title>Custom inter/intra matrices</title>
|
|
|
|
<para>
|
|
With this feature of
|
|
<link linkend="ffmpeg"><systemitem class="library">libavcodec</systemitem></link>
|
|
you are able to set custom inter (I-frames/keyframes) and intra
|
|
(P-frames/predicted frames) matrices. It is supported by many of the codecs:
|
|
<systemitem>mpeg1video</systemitem> and <systemitem>mpeg2video</systemitem>
|
|
are reported as working.
|
|
</para>
|
|
|
|
<para>
|
|
A typical usage of this feature is to set the matrices preferred by the
|
|
<ulink url="http://www.kvcd.net/">KVCD</ulink> specifications.
|
|
</para>
|
|
|
|
<para>
|
|
The <emphasis role="bold">KVCD "Notch" Quantization Matrix:</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
Intra:
|
|
<screen>
|
|
8 9 12 22 26 27 29 34
|
|
9 10 14 26 27 29 34 37
|
|
12 14 18 27 29 34 37 38
|
|
22 26 27 31 36 37 38 40
|
|
26 27 29 36 39 38 40 48
|
|
27 29 34 37 38 40 48 58
|
|
29 34 37 38 40 48 58 69
|
|
34 37 38 40 48 58 69 79
|
|
</screen>
|
|
|
|
Inter:
|
|
<screen>
|
|
16 18 20 22 24 26 28 30
|
|
18 20 22 24 26 28 30 32
|
|
20 22 24 26 28 30 32 34
|
|
22 24 26 30 32 32 34 36
|
|
24 26 28 32 34 34 36 38
|
|
26 28 30 32 34 36 38 40
|
|
28 30 32 34 36 38 42 42
|
|
30 32 34 36 38 40 42 44
|
|
</screen>
|
|
</para>
|
|
|
|
<para>
|
|
Usage:
|
|
<screen>
|
|
$ mencoder <replaceable>input.avi</replaceable> -o <replaceable>output.avi</replaceable> -oac copy -ovc lavc -lavcopts inter_matrix=...:intra_matrix=...
|
|
</screen>
|
|
</para>
|
|
|
|
<para>
|
|
<screen>
|
|
$ mencoder <replaceable>input.avi</replaceable> -ovc lavc -lavcopts
|
|
vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,
|
|
12,14,18,27,29,34,37,38,22,26,27,31,36,37,38,40,26,27,29,36,39,38,40,48,27,
|
|
29,34,37,38,40,48,58,29,34,37,38,40,48,58,69,34,37,38,40,48,58,69,79
|
|
:inter_matrix=16,18,20,22,24,26,28,30,18,20,22,24,26,28,30,32,20,22,24,26,
|
|
28,30,32,34,22,24,26,30,32,32,34,36,24,26,28,32,34,34,36,38,26,28,30,32,34,
|
|
36,38,40,28,30,32,34,36,38,42,42,30,32,34,36,38,40,42,44 -oac copy -o svcd.mpg
|
|
</screen>
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="menc-feat-dvd-mpeg4">
|
|
<title>Making a high quality MPEG4 ("DivX") rip of a DVD movie</title>
|
|
|
|
<para>
|
|
One frequently asked question is "How do I make the highest quality DVD
|
|
rip possible? I don't care about file size, I just want the best
|
|
quality."
|
|
</para>
|
|
|
|
<para>
|
|
This question is perhaps at least somewhat wrongly posed. After all, if
|
|
you don't care about file size, why not simply copy the MPEG2 video
|
|
stream from the DVD whole? Sure, your AVI will end up being 5GB, give
|
|
or take, but if you want the best quality and don't care about size,
|
|
this is certainly your best option.
|
|
</para>
|
|
|
|
<para>
|
|
In fact, the reason you want to transcode a DVD into MPEG4 is
|
|
specifically because you <emphasis role="bold">do</emphasis> care about
|
|
file size.
|
|
</para>
|
|
|
|
<para>
|
|
It's difficult to offer a cookbook recipe on how to create a very high
|
|
quality DVD rip. There are several factors to consider, and you should
|
|
understand these details or else you're likely to end up disappointed
|
|
with your results. Below we'll investigate some of these issues, and
|
|
then have a look at an example. We assume you're using
|
|
<systemitem class="library">libavcodec</systemitem> to encode the video,
|
|
although the theory applies to other codecs as well.
|
|
</para>
|
|
|
|
<para>
|
|
The main assumption of this guide is that you have no specific file size
|
|
constraints and have no problem giving up bits in exchange for quality.
|
|
While much of the information presented here is useful in any case, some
|
|
of it may work against you if you have a file size goal, such as fitting a
|
|
video on a CD.
|
|
</para>
|
|
|
|
<sect2 id="menc-feat-dvd-mpeg4-2pass">
|
|
<title>Constant Quantizer vs. 2-pass</title>
|
|
|
|
<para>
|
|
There are three approaches to encoding the video: constant bitrate
|
|
(CBR), constant quantizer, and two-pass (ABR, or average bitrate).
|
|
</para>
|
|
|
|
<para>
|
|
In each of these modes, <systemitem class="library">libavcodec</systemitem>
|
|
breaks the video frame into 16x16 pixel macroblocks and then applies a
|
|
quantizer to each macroblock. The lower the quantizer, the better the
|
|
quality and higher the bitrate. The method
|
|
<systemitem class="library">libavcodec</systemitem> uses to determine
|
|
which quantizer to use for a given macroblock varies and is highly
|
|
tunable. (This is an extreme over-simplification of the actual
|
|
process, but the basic concept is useful to understand.)
|
|
</para>
|
|
|
|
<para>
|
|
When you specify a constant bitrate, <systemitem
|
|
class="library">libavcodec</systemitem> will encode the video, discarding
|
|
detail as much as necessary and as little as possible in order to remain
|
|
lower than the given bitrate. If you truly don't care about file size,
|
|
you could as well use CBR and specify a bitrate of infinity. (In
|
|
practice, this means a value high enough so that it poses no limit, like
|
|
10000Kbit.) With no real restriction on bitrate, the result is that
|
|
<systemitem class="library">libavcodec</systemitem> will use the lowest
|
|
possible quantizer for each macroblock (as specified by
|
|
<option>vqmin</option>, which is 2 by default). As soon as you specify a
|
|
low enough bitrate that <systemitem class="library">libavcodec</systemitem>
|
|
is forced to use a higher quantizer, then you're almost certainly ruining
|
|
the quality of your video. In general, you should avoid CBR altogether if
|
|
you care about quality.
|
|
</para>
|
|
|
|
<para>
|
|
With constant quantizer, <systemitem
|
|
class="library">libavcodec</systemitem> uses the same quantizer, as
|
|
specified by the <option>vqscale</option> option, on every macroblock. If
|
|
you want the highest quality rip possible, again ignoring bitrate, you can
|
|
use <option>vqscale=2</option>. This will yield the same bitrate and PSNR
|
|
(peak signal-to-noise ratio) as CBR with
|
|
<option>vbitrate</option>=infinity and the default <option>vqmin</option>
|
|
of 2.
|
|
</para>
|
|
|
|
<para>
|
|
The problem with constant quantizing is that it uses the given quantizer
|
|
whether the macroblock needs it or not. That is, it might be possible
|
|
to use a higher quantizer on a macroblock without sacrificing visual
|
|
quality. Why waste the bits on an unnecessarily low quantizer? Your
|
|
CPU has as many cycles as there is time, but there's only so many bits
|
|
on your harddisk.
|
|
</para>
|
|
|
|
<para>
|
|
With a two-pass encode, the first pass will rip the movie as though it
|
|
were CBR, but it will keep a log of properties for each frame. This
|
|
data is then used during the second pass in order to make intelligent
|
|
decisions about which quantizers to use. During fast action or low
|
|
detail scenes, higher quantizers will likely be used, and during
|
|
slow moving or high detail scenes, lower quantizers will be used.
|
|
</para>
|
|
|
|
<para>
|
|
If you use <option>vqscale=2</option>, then you're wasting bits. If you
|
|
use <option>vqscale=3</option>, then you're not getting the highest
|
|
quality rip. Suppose you rip a DVD at <option>vqscale=3</option>, and
|
|
the result is 1800Kbit. If you do a two-pass encode with
|
|
<option>vbitrate=1800</option>, the resulting video will have <emphasis
|
|
role="bold">higher quality</emphasis> for the <emphasis role="bold">same
|
|
bitrate</emphasis>.
|
|
</para>
|
|
|
|
<para>
|
|
Since you're now convinced that two-pass is the way to go, the real
|
|
question now is what bitrate to use? The answer is that there's no
|
|
single answer. Ideally you want to choose a bitrate that yields the
|
|
best balance between quality and file size. This is going to vary
|
|
depending on the source video.
|
|
</para>
|
|
|
|
<para>
|
|
A good starting point for a very high quality rip is about 2000Kbit plus
|
|
or minus 200Kbit. For fast action or high detail source video, or if
|
|
you just have a very critical eye, you might decide on 2400 or 2600.
|
|
For some DVDs, you might not notice a difference at 1400Kbit. It's a
|
|
good idea to experiment with scenes at different bitrates to get a feel.
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="menc-feat-dvd-mpeg4-crop">
|
|
<title>Cropping and Scaling</title>
|
|
|
|
<para>
|
|
Native DVD resolution is 720x480 for NTSC, and 720x576 for PAL, but
|
|
there's an aspect flag that specifies whether it's full-screen (4:3) or
|
|
wide-screen (16:9). Many (if not most) widescreen DVDs are not strictly
|
|
16:9, and will be either 1.85:1 or 2.35:1 (cinescope). This means that
|
|
there will be black bands in the video that will need to be cropped out.
|
|
</para>
|
|
|
|
<para>
|
|
<application>MPlayer</application> provides a crop detection filter that
|
|
will determine the crop rectangle (<option>-vf cropdetect</option>).
|
|
Because MPEG4 uses 16x16 macroblocks, you'll want to make sure that each
|
|
dimension of the video you're encoding is a multiple of 16 or else you
|
|
will be degrading quality, especially at lower bitrates. You can do this
|
|
by rounding the width and height of the crop rectangle down to the nearest
|
|
multiple of 16. When cropping, you'll want to increase the y-offset by
|
|
half the difference of the old and the new height so that the resulting
|
|
video is taken from the center of the frame. And because of the way DVD
|
|
video is sampled, make sure the offset is an even number. (In fact, as a
|
|
rule, never use odd values for any parameter when you're cropping and
|
|
scaling video.) If you're not comfortable throwing a few extra pixels
|
|
away, you might prefer instead to scale the video instead. We'll look
|
|
at this in our example below.
|
|
</para>
|
|
|
|
<para>
|
|
Also, be careful about "half black" pixels at the edges. Make sure you
|
|
crop these out too, or else you'll be wasting bits there that
|
|
are better spent elsewhere.
|
|
</para>
|
|
|
|
<para>
|
|
After all is said and done, you'll probably end up with video whose pixels
|
|
aren't quite 1.85:1 or 2.35:1, but rather something close to that. You
|
|
could calculate the new aspect ratio manually, but
|
|
<application>MEncoder</application> offers an option for <systemitem
|
|
class="library">libavcodec</systemitem> called <option>autoaspect</option>
|
|
that will do this for you. Absolutely do not scale this video in order to
|
|
square the pixels unless you like to waste your harddisk space. Scaling
|
|
should be done on playback, and the player will use the aspect stored in
|
|
the AVI to determine the correct resolution.
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="menc-feat-dvd-mpeg4-audio">
|
|
<title>Audio</title>
|
|
|
|
<para>
|
|
Audio is a much simpler problem to solve: just leave it as is. Even AC3
|
|
5.1 streams are at most 448Kbit/s, and they're worth every bit. You
|
|
might be tempted to transcode the audio to high quality Ogg Vorbis, but
|
|
just because you don't have an A/V receiver for AC3 pass-through today
|
|
doesn't mean you won't have one tomorrow. Future-proof your DVD rips by
|
|
preserving the AC3 stream.
|
|
</para>
|
|
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="menc-feat-dvd-mpeg4-interlacing">
|
|
<title>Interlacing and Telecine</title>
|
|
|
|
<para>
|
|
Almost all movies are shot at 24 fps. Because NTSC is 29.97 fps, some
|
|
processing must be done to this 24 fps video to make it run at the correct
|
|
NTSC framerate. The process is called 3:2 pulldown, commonly referred to
|
|
as telecine (because pulldown is often applied during the telecine
|
|
process), and, naively described, it works by slowing the film down to
|
|
23.976 fps, and repeating every fourth frame.
|
|
</para>
|
|
|
|
<para>
|
|
No special processing, however, is done to the video for PAL DVDs, which
|
|
run at 25 fps. (Technically, PAL can be telecined, called 2:2 pulldown,
|
|
but this doesn't become an issue in practice.) The 24 fps film is simply
|
|
played back at 25 fps. The result is that the movie runs slightly faster,
|
|
but unless you're an alien, you probably won't notice the difference.
|
|
Most PAL DVDs have pitch-corrected audio, so when they're played back at
|
|
25 fps things will sound right, even though the audio track (and hence the
|
|
whole movie) has a running time that's 4% less than NTSC DVDs.
|
|
</para>
|
|
|
|
<para>
|
|
Because the video in a PAL DVD hasn't been altered, you needn't worry
|
|
much about frame rate. The source is 25 fps, and your rip will be 25
|
|
fps. However, if you're ripping an NTSC DVD movie, you may need to
|
|
apply inverse telecine.
|
|
</para>
|
|
|
|
<para>
|
|
For movies shot at 24 fps, the video on the NTSC DVD is either telecined
|
|
29.97 fps, or else it is progressive 24 fps and intended to be telecined
|
|
on-the-fly by a DVD player. On the other hand, TV series are usually
|
|
only interlaced, not telecined. This is not a hard rule: some TV series
|
|
are interlaced (such as Buffy the Vampire Slayer) whereas some are a
|
|
mixture of progressive and interlaced (such as Angel, or 24).
|
|
</para>
|
|
|
|
<para>
|
|
It's highly recommended that you read the section on <link
|
|
linkend="menc-feat-telecine">How to deal with telecine and interlacing
|
|
in NTSC DVDs</link> to learn how to handle the different possibilities.
|
|
</para>
|
|
|
|
<para>
|
|
However, if you're mostly just ripping movies, likely you're either
|
|
dealing with 24 fps progressive or telecined video, in which case you can
|
|
use the <option>pullup</option> filter <option>-vf
|
|
pullup,softskip</option>.
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
|
|
<sect2 id="menc-feat-dvd-mpeg4-filtering">
|
|
<title>Filtering</title>
|
|
|
|
<para>
|
|
In general, you want to do as little filtering as possible to the movie
|
|
in order to remain close to the original DVD source. Cropping is often
|
|
necessary (as described above), but do not scale the video. Although
|
|
scaling down is sometimes preferred to using higher quantizers, we want
|
|
to avoid both these things: remember that we decided from the start to
|
|
trade bits for quality.
|
|
</para>
|
|
|
|
<para>
|
|
Also, do not adjust gamma, contrast, brightness, etc. What looks good
|
|
on your display may not look good on others. These adjustments should
|
|
be done on playback only.
|
|
</para>
|
|
|
|
<para>
|
|
One thing you might want to do, however, is pass the video through a
|
|
very light denoise filter, such as <option>-vf hqdn3d=2:1:2</option>.
|
|
Again, it's a matter of putting those bits to better use: why waste them
|
|
encoding noise when you can just add that noise back in during playback?
|
|
Increasing the parameters for <option>hqdn3d</option> will further
|
|
improve compressibility, but if you increase the values too much, you
|
|
risk degrading the image visibily. The suggested values above
|
|
(<option>2:1:2</option>) are quite conservative; you should feel free to
|
|
experiment with higher values and observe the results for yourself.
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
|
|
<sect2 id="menc-feat-dvd-mpeg4-example">
|
|
<title>Example</title>
|
|
|
|
<para>
|
|
So, you've just bought your shiny new copy of Harry Potter and the Chamber
|
|
of Secrets (widescreen edition, of course), and you want to rip this DVD
|
|
so that you can add it to your Home Theatre PC. This is a region 1 DVD,
|
|
so it's NTSC. The example below will still apply to PAL, except you'll
|
|
omit <option>-ofps 23.976</option> (because the output framerate is the
|
|
same as the input framerate), and of course the crop dimensions will be
|
|
different.
|
|
</para>
|
|
|
|
<para>
|
|
After running <option>mplayer dvd://1</option>, we follow the process
|
|
detailed in the section <link linkend="menc-feat-telecine">How to deal
|
|
with telecine and interlacing in NTSC DVDs</link> and discover that it's
|
|
24 fps progressive video, which means that we needn't use an inverse
|
|
telecine filter, such as <option>pullup</option> or
|
|
<option>filmdint</option>.
|
|
</para>
|
|
|
|
<para>
|
|
Next, we want to determine the appropriate crop rectangle, so we use the
|
|
cropdetect filter:
|
|
|
|
<screen>mplayer dvd://1 -vf cropdetect</screen>
|
|
|
|
Make sure you seek to a fully filled frame (such as a bright scene), and
|
|
you'll see in <application>MPlayer</application>'s console output:
|
|
|
|
<screen>crop area: X: 0..719 Y: 57..419 (-vf crop=720:362:0:58)</screen>
|
|
|
|
We then play the movie back with this filter to test its correctness:
|
|
|
|
<screen>mplayer dvd://1 -vf crop=720:362:0:58</screen>
|
|
|
|
And we see that it looks perfectly fine. Next, we ensure the width and
|
|
height are a multiple of 16. The width is fine, however the height is
|
|
not. Since we didn't fail 7th grade math, we know that the nearest
|
|
multiple of 16 lower than 362 is 352.
|
|
</para>
|
|
|
|
<para>
|
|
We could just use <option>crop=720:352:0:58</option>, but it'd be nice
|
|
to take a little off the top and a little off the bottom so that we
|
|
retain the center. We've shrunk the height by 10 pixels, but we don't
|
|
want to increase the y-offset by 5-pixels since that's an odd number and
|
|
will adversely affect quality. Instead, we'll increase the y-offset by
|
|
4 pixels:
|
|
|
|
<screen>mplayer dvd://1 -vf crop=720:352:0:62</screen>
|
|
|
|
Another reason to shave pixels from both the top and the bottom is that we
|
|
ensure we've eliminated any half-black pixels if they exist. Note that if
|
|
your video is telecined, make sure the <option>pullup</option> filter (or
|
|
whichever inverse telecine filter you decide to use) appears in the filter
|
|
chain before you crop. If it is interlaced, deinterlace before cropping.
|
|
(If you choose to preserve the interlaced video, then make sure your
|
|
vertical crop offset is a multiple of 4.)
|
|
</para>
|
|
|
|
<para>
|
|
If you're really concerned about losing those 10 pixels, you might
|
|
prefer instead to scale the dimensions down to the nearest multiple of 16.
|
|
The filter chain would look like:
|
|
|
|
<screen>-vf crop=720:362:0:58,scale=720:352</screen>
|
|
|
|
Scaling the video down like this will mean that some small amount of
|
|
detail is lost, though it probably won't be perceptible. Scaling up will
|
|
result in lower quality (unless you increase the bitrate). Cropping
|
|
discards those pixels altogether. It's a tradeoff that you'll want to
|
|
consider for each circumstance. For example, if the DVD video was made
|
|
for television, you might want to avoid vertical scaling, since the line
|
|
sampling corresponds to the way the content was originally recorded.
|
|
</para>
|
|
|
|
<para>
|
|
On inspection, we see that our movie has a fair bit of action and high
|
|
amounts of detail, so we pick 2400Kbit for our bitrate.
|
|
</para>
|
|
|
|
<para>
|
|
We're now ready to do the 2-pass encode. Pass 1:
|
|
|
|
<screen>mencoder dvd://1 -ofps 23.976 -oac copy -vf crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
|
|
-lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=1 \
|
|
-o Harry_Potter_2.avi</screen>
|
|
|
|
And pass 2 is the same, except that we specify <option>vpass=2</option>:
|
|
|
|
<screen>mencoder dvd://1 -ofps 23.976 -oac copy -vf crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
|
|
-lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=2 \
|
|
-o Harry_Potter_2.avi</screen>
|
|
</para>
|
|
|
|
<para>
|
|
The options <option>v4mv:mbd=2:trell</option> will greatly increase the
|
|
quality at the expense of encoding time. There's little reason to leave
|
|
these options out when the primary goal is quality. The options
|
|
<option>cmp=3:subcmp=3:mbcmp=3</option> select a comparison function that
|
|
yields higher quality than the defaults. You might try experimenting with
|
|
this parameter (refer to the man page for the possible values) as
|
|
different functions can have a large impact on quality depending on the
|
|
source material. For example, if you find
|
|
<systemitem class="library">libavcodec</systemitem> produces too much
|
|
blocky artifacting, you could try selecting the experimental NSSE as
|
|
comparison function via <option>*cmp=10</option>.
|
|
</para>
|
|
|
|
<para>
|
|
For this movie, the resulting AVI will be 138 minutes long and nearly
|
|
3GB. And because you said that file size doesn't matter, this is a
|
|
perfectly acceptable size. However, if you had wanted it smaller, you
|
|
could try a lower bitrate. Increasing bitrates have diminishing
|
|
returns, so while we might clearly see an improvement from 1800Kbit to
|
|
2000Kbit, it might not be so noticeable above 2000Kbit. Feel
|
|
free to experiment until you're happy.
|
|
</para>
|
|
|
|
<para>
|
|
Because we passed the source video through a denoise filter, you may want
|
|
to add some of it back during playback. This, along with the
|
|
<option>spp</option> post-processing filter, drastically improves the
|
|
perception of quality and helps eliminate blocky artifacts in the video.
|
|
With <application>MPlayer</application>'s <option>autoq</option> option,
|
|
you can vary the amount of post-processing done by the spp filter
|
|
depending on available CPU. Also, at this point, you may want to apply
|
|
gamma and/or color correction to best suit your display. For example:
|
|
|
|
<screen>mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3</screen>
|
|
|
|
</para>
|
|
</sect2>
|
|
|
|
</sect1>
|
|
|
|
<sect1 id="menc-feat-telecine">
|
|
<title>How to deal with telecine and interlacing within NTSC DVDs</title>
|
|
|
|
<formalpara>
|
|
<title>Introduction</title>
|
|
<para>
|
|
I suggest you visit this page if you don't understand much of what
|
|
is written in this document:
|
|
<ulink url="http://www.divx.com/support/guides/guide.php?gid=10">http://www.divx.com/support/guides/guide.php?gid=10</ulink>
|
|
This URL links to an understandable and reasonably comprehensive
|
|
description of what telecine is.
|
|
</para></formalpara>
|
|
|
|
<para>
|
|
For technical reasons pertaining to the limitations of early
|
|
television hardware, all video intended to be displayed on an NTSC
|
|
television set must be 59.94 fields per second. Made-for-TV movies
|
|
and shows are often filmed directly at 59.94 fields per second, but
|
|
the majority of cinema is filmed at 24 or 23.976 frames per
|
|
second. When cinematic movie DVDs are mastered, the video is then
|
|
converted for television using a process called telecine.
|
|
</para>
|
|
|
|
<para>
|
|
On a DVD, the video is never actually stored as 59.94 fields per
|
|
second. For video that was originally 59.94, each pair of fields is
|
|
combined to form a frame, resulting in 29.97 frames per
|
|
second. Hardware DVD players then read a flag embedded in the video
|
|
stream to determine whether the odd- or even-numbered lines should
|
|
form the first field.
|
|
</para>
|
|
|
|
<para>
|
|
Usually, 23.976 frames per second content stays as it is when
|
|
encoded for a DVD, and the DVD player must perform telecining
|
|
on-the-fly. Sometimes, however, the video is telecined
|
|
<emphasis>before</emphasis> being stored on the DVD; even though it
|
|
was originally 23.976 frames per second, it becomes 59.94 fields per
|
|
second, and is stored on the disk as 29.97 frames per second.
|
|
</para>
|
|
|
|
<para>
|
|
When looking at individual frames formed from 59.94 fields per
|
|
second video, telecined or otherwise, interlacing is clearly visible
|
|
wherever there is any motion, because one field (say, the
|
|
even-numbered lines) represents a moment in time 1/59.94th of a
|
|
second later than the other. Playing interlaced video on a computer
|
|
looks ugly both because the monitor is higher resolution and because
|
|
the video is shown frame-after-frame instead of field-after-field.
|
|
</para>
|
|
|
|
<para>
|
|
Notes:
|
|
</para>
|
|
<itemizedlist>
|
|
<listitem><para>
|
|
This section only applies to NTSC DVDs, and not PAL.
|
|
</para></listitem>
|
|
<listitem><para>
|
|
The example <application>MEncoder</application> lines throughout the
|
|
document are <emphasis role="bold">not</emphasis> intended for
|
|
actual use. They are simply the bare minimum required to encode the
|
|
pertaining video category. How to make good DVD rips or fine-tune
|
|
<systemitem class="library">libavcodec</systemitem> for maximum
|
|
quality is not within the scope of this document.
|
|
</para></listitem>
|
|
<listitem><para>
|
|
There are a couple footnotes specific to this guide, linked like this:
|
|
<link linkend="menc-feat-telecine-footnotes">[1]</link>
|
|
</para></listitem>
|
|
</itemizedlist>
|
|
|
|
<sect2 id="menc-feat-telecine-ident">
|
|
<title>How to tell what type of video you have</title>
|
|
|
|
<sect3 id="menc-feat-telecine-ident-progressive">
|
|
<title>Progressive</title>
|
|
<para>
|
|
Progressive video was originally filmed at 23.976 fps, and stored
|
|
on the DVD without alteration.
|
|
</para>
|
|
|
|
<para>
|
|
When you play a progressive DVD in <application>MPlayer</application>,
|
|
<application>MPlayer</application> will print the following line as
|
|
soon as the movie begins to play:
|
|
|
|
<screen> demux_mpg: 24fps progressive NTSC content detected, switching framerate.</screen>
|
|
|
|
From this point forward, demux_mpg should never say it finds
|
|
"30fps NTSC content."
|
|
</para>
|
|
|
|
<para>
|
|
When you watch progressive video, you should never see any
|
|
interlacing. Beware, however, because sometimes there is a tiny bit
|
|
of telecine mixed in, where you wouldn't expect. I've encountered TV
|
|
show DVDs that have one second of telecine at every scene change, or
|
|
at seemingly random places. I once watched a DVD that had a
|
|
progressive first half, and the second half was telecined. If you
|
|
want to be <emphasis>really</emphasis> thorough, you can scan the
|
|
entire movie:
|
|
|
|
<screen>mplayer dvd://1 -nosound -vo null -benchmark</screen>
|
|
|
|
Using <option>-benchmark</option> makes
|
|
<application>MPlayer</application> play the movie as quickly as it
|
|
possibly can; still, depending on your hardware, it can take a
|
|
while. Every time demux_mpg reports a framerate change, the line
|
|
immediately above will show you the time at which the change
|
|
occurred.
|
|
</para>
|
|
|
|
<para>
|
|
Sometimes progressive video is referred to as "soft-telecine"
|
|
because it is intended to be telecined by the DVD player.
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-ident-telecined">
|
|
<title>Telecined</title>
|
|
<para>
|
|
Telecined video was originally filmed at 23.976, but was telecined
|
|
<emphasis>before</emphasis> it was written to the DVD.
|
|
</para>
|
|
|
|
<para>
|
|
<application>MPlayer</application> does not (ever) report any
|
|
framerate changes when it plays telecined video.
|
|
</para>
|
|
|
|
<para>
|
|
Watching a telecined video, you will see interlacing artifacts that
|
|
seem to "blink": they repeatedly appear and disappear.
|
|
You can look closely at this by
|
|
<orderedlist>
|
|
<listitem>
|
|
<screen>mplayer dvd://1 -speed 0.1</screen>
|
|
</listitem>
|
|
<listitem><para>
|
|
Seek to a part with motion.
|
|
</para></listitem>
|
|
<listitem><para>
|
|
Look at the pattern of interlaced-looking and progressive-looking
|
|
frames. If the pattern you see is PPPII,PPPII,PPPII,... then the
|
|
video is telecined. If you see some other pattern, then the video
|
|
may have been telecined using some non-standard method and
|
|
<application>MEncoder</application> cannot losslessly convert it
|
|
to progressive. If you don't see any pattern at all, then it is
|
|
most likely interlaced.
|
|
</para></listitem>
|
|
</orderedlist>
|
|
</para>
|
|
|
|
<para>
|
|
Sometimes telecined video is referred to as "hard-telecine".
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-ident-interlaced">
|
|
<title>Interlaced</title>
|
|
<para>
|
|
|
|
Interlaced video was originally filmed at 59.94 fields per second,
|
|
and stored on the DVD as 29.97 frames per second. The interlacing is
|
|
a result of combining pairs of fields into frames, because within
|
|
each frame, each field is 1/59.94 seconds apart.
|
|
</para>
|
|
|
|
<para>
|
|
As with telecined video, <application>MPlayer</application> should
|
|
not ever report any framerate changes when playing interlaced content.
|
|
</para>
|
|
|
|
<para>
|
|
When you view an interlaced video closely with <option>-speed 0.1</option>,
|
|
you will see that every single frame is interlaced.
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-ident-mixedpt">
|
|
<title>Mixed progressive and telecine</title>
|
|
<para>
|
|
All of a "mixed progressive and telecine" video was originally
|
|
23.976 frames per second, but some parts of it ended up being telecined.
|
|
</para>
|
|
|
|
<para>
|
|
When <application>MPlayer</application> plays this category, it will
|
|
(often repeatedly) switch back and forth between "30fps
|
|
NTSC" and "24fps progressive NTSC". Watch the bottom of
|
|
<application>MPlayer</application>'s output to see these messages.
|
|
</para>
|
|
|
|
<para>
|
|
You should check the "30fps NTSC" sections to make sure
|
|
they are actually telecine, and not just interlaced.
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-ident-mixedpi">
|
|
<title>Mixed progressive and interlaced</title>
|
|
<para>
|
|
In "mixed progressive and interlaced" content, progressive
|
|
and interlaced video have been spliced together.
|
|
</para>
|
|
|
|
<para>
|
|
This category looks just like "mixed progressive and telecine",
|
|
until you examine the 30fps sections and see that they don't have the
|
|
telecine pattern.
|
|
</para>
|
|
</sect3>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="menc-feat-telecine-encode">
|
|
<title>How to encode each category</title>
|
|
<para>
|
|
As I mentioned in the beginning, example <application>MEncoder</application>
|
|
lines below are <emphasis role="bold">not</emphasis> meant to actually be used;
|
|
they only demonstrate the minimum parameters to properly encode each category.
|
|
</para>
|
|
|
|
<sect3 id="menc-feat-telecine-encode-progressive">
|
|
<title>Progressive</title>
|
|
<para>
|
|
Progressive video requires no special filtering to encode. The only
|
|
parameter you need to be sure to use is
|
|
<option>-ofps 23.976</option>. Otherwise, <application>MEncoder</application>
|
|
will try to encode at 29.97 fps and duplicate frames.
|
|
</para>
|
|
|
|
<para>
|
|
<screen>mencoder dvd://1 -nosound -ovc lavc -ofps 23.976</screen>
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-encode-telecined">
|
|
<title>Telecined</title>
|
|
<para>
|
|
Telecine can be reversed to retrieve the original 23.976 content,
|
|
using a process called inverse-telecine.
|
|
<application>MPlayer</application> contains two filters to
|
|
accomplish this: <option>detc</option> and
|
|
<option>ivtc</option>. You can read the manual page to see their
|
|
differences, but for DVDs I've never had a problem with
|
|
<option>ivtc</option>. Note that you should
|
|
<emphasis role="bold">always</emphasis> inverse-telecine before any
|
|
rescaling; unless you really know what you're doing,
|
|
inverse-telecine before cropping, too
|
|
<link linkend="menc-feat-telecine-footnotes">[1]</link>. Again,
|
|
<option>-ofps 23.976</option> is needed, too.
|
|
</para>
|
|
|
|
<para>
|
|
<screen>mencoder dvd://1 -nosound -vf ivtc=1 -ovc lavc -ofps 23.976</screen>
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-encode-interlaced">
|
|
<title>Interlaced</title>
|
|
<para>
|
|
For most practical cases it is not possible to retrieve a complete
|
|
progressive video from interlaced content. The only way to do so
|
|
without losing half of the vertical resolution is to double the
|
|
framerate and try to "guess" what ought to make up the
|
|
corresponding lines for each field (this has drawbacks - see method
|
|
3).
|
|
</para>
|
|
|
|
<orderedlist>
|
|
<listitem><para>
|
|
|
|
Encode the video in interlaced form. Normally, interlacing wreaks
|
|
havoc with the encoder's ability to compress well, but
|
|
<systemitem class="library">libavcodec</systemitem> has two
|
|
parameters specifically for dealing with storing interlaced video a
|
|
bit better: <option> ildct</option> and <option>ilme</option>. Also,
|
|
using <option>mbd=2</option> is strongly recommended
|
|
<link linkend="menc-feat-telecine-footnotes">[2] </link> because it
|
|
will encode macroblocks as non-interlaced in places where there is
|
|
no motion. Note that <option>-ofps</option> is NOT needed here.
|
|
|
|
<screen>mencoder dvd://1 -nosound -ovc lavc -lavcopts ildct:ilme:mbd=2</screen>
|
|
</para></listitem>
|
|
<listitem><para>
|
|
Use a deinterlacing filter before encoding. There are several of
|
|
these filters available to choose from, each with its own advantages
|
|
and disadvantages. Consult <option>mplayer -pphelp</option> to see
|
|
what's available (grep for "deint"), and search the
|
|
<ulink url="http://www.mplayerhq.hu/homepage/design6/info.html#mailing_lists">
|
|
MPlayer mailing lists</ulink> to find many discussions about the
|
|
various filters. Again, the framerate is not changing, so no
|
|
<option>-ofps</option>. Also, deinterlacing should be done after
|
|
cropping <link linkend="menc-feat-telecine-footnotes">[1]</link> and
|
|
before scaling.
|
|
|
|
<screen>mencoder dvd://1 -nosound -vf pp=lb -ovc lavc</screen>
|
|
</para></listitem>
|
|
<listitem><para>
|
|
Unfortunately, this option is buggy with
|
|
<application>MEncoder</application>; it ought to work well with
|
|
<application>MEncoder G2</application>, but that isn't here yet. You
|
|
might experience crahes. Anyway, the purpose of <option> -vf
|
|
tfields</option> is to create a full frame out of each field, which
|
|
makes the framerate 59.94. The advantage of this approach is that no
|
|
data is ever lost; however, since each frame comes from only one
|
|
field, the missing lines have to be interpolated somehow. There are
|
|
no very good methods of generating the missing data, and so the
|
|
result will look a bit similar to when using some deinterlacing
|
|
filters. Generating the missing lines creates other issues, as well,
|
|
simply because the amount of data doubles. So, higher encoding
|
|
bitrates are required to maintain quality, and more CPU power is
|
|
used for both encoding and decoding. tfields has several different
|
|
options for how to create the missing lines of each frame. If you
|
|
use this method, then Reference the manual, and chose whichever
|
|
option looks best for your material. Note that when using
|
|
<option>tfields</option> you
|
|
<emphasis role="bold">have to</emphasis> specify both
|
|
<option>-fps</option> and <option>-ofps</option> to be twice the
|
|
framerate of your original source.
|
|
|
|
<screen>mencoder dvd://1 -nosound -vf tfields=2 -ovc lavc -fps 59.94 -ofps 59.94</screen>
|
|
</para></listitem>
|
|
<listitem><para>
|
|
If you plan on downscaling dramatically, you can excise and encode
|
|
only one of the two fields. Of course, you'll lose half the vertical
|
|
resolution, but if you plan on downscaling to at most 1/2 of the
|
|
original, the loss won't matter much. The result will be a
|
|
progressive 29.97 frames per second file. The procedure is to use
|
|
<option>-vf field</option>, then crop
|
|
<link linkend="menc-feat-telecine-footnotes">[1]</link> and scale
|
|
appropriately. Remember that you'll have to adjust the scale to
|
|
compensate for the vertical resolution being halved.
|
|
<screen>mencoder dvd://1 -nosound -vf field=0 -ovc lavc</screen>
|
|
</para></listitem>
|
|
</orderedlist>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-encode-mixedpt">
|
|
<title>Mixed progressive and telecine</title>
|
|
<para>
|
|
In order to turn mixed progressive and telecine video into entirely
|
|
progressive video, the telecined parts have to be
|
|
inverse-telecined. There are two filters that accomplish this
|
|
natively, but a better solution most of the time is to use two
|
|
filters in conjunction (read onward for more detail).
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
<listitem><para>
|
|
Currently the most reliable method to deal with this type of video
|
|
is to, rather than inverse-telecine the telecined parts, telecine
|
|
the non-telecined parts and then inverse-telecine the whole
|
|
video. Sound confusing? softpulldown is a filter that goes through
|
|
a video and makes the entire file telecined. If we follow
|
|
softpulldown with either <option>detc</option> or
|
|
<option>ivtc</option>, the final result will be entirely
|
|
progressive. Cropping and scaling should be done after the
|
|
inverse-telecine operations, and <option> -ofps 23.976</option> is
|
|
needed.
|
|
|
|
<screen>mencoder dvd://1 -nosound -vf softpulldown,ivtc=1 -ovc lavc -ofps 23.976</screen>
|
|
</para>
|
|
</listitem>
|
|
<listitem><para>
|
|
<option>-vf pullup</option> is designed to inverse-telecine
|
|
telecined material while leaving progressive data alone. Pullup
|
|
doesn't really work well with the current
|
|
<application>MEncoder</application>, though, and is really intended
|
|
for use with <application>MEncoder G2</application> (whenever it's
|
|
ready). It works fine without <option>-ofps</option>, but
|
|
<option>-ofps</option> is needed to prevent choppy output. With
|
|
<option>-ofps</option>, it sometimes fails. The problems arise from
|
|
<application>MEncoder</application>'s behavior of dropping frames to
|
|
maintain synchronization between the audio and video: it drops
|
|
frames before sending them through the filter chain, rather than
|
|
after. As a result, <option>pullup</option> is sometimes deprived
|
|
of the data it needs.
|
|
</para>
|
|
|
|
<para>
|
|
If <application>MEncoder</application> drops too many frames in a
|
|
row, it starves <option>pullup</option>'s buffers and causes it to
|
|
crash.
|
|
</para>
|
|
|
|
<para>
|
|
Even if <application>MEncoder</application> only drops one frame,
|
|
<option> pullup</option> still doesn't get to see it, and will end
|
|
up operating on an incorrect sequence of frames. Even though this
|
|
doesn't cause a crash, <option> pullup</option> won't be able to
|
|
make correct decisions on how to reassemble progressive frames, and
|
|
will either match fields together incorrectly or drop several fields
|
|
to compensate.
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem><para>
|
|
I haven't used <option>-vf filmdint</option> myself, but here's what
|
|
D Richard Felker III has to say:
|
|
|
|
<blockquote><para>It's OK, but IMO it tries to deinterlace rather
|
|
than doing inverse telecine too often (much like settop DVD
|
|
players & progressive TVs) which gives ugly flickering and
|
|
other artefacts. If you're going to use it, you at least need to
|
|
spend some time tuning the options and watching the output first
|
|
to make sure it's not messing up.</para></blockquote>
|
|
</para></listitem>
|
|
</itemizedlist>
|
|
</sect3>
|
|
|
|
<sect3 id="menc-feat-telecine-encode-mixedpi">
|
|
<title>Mixed progressive and interlaced</title>
|
|
<para>
|
|
There are two options for dealing with this category, each of
|
|
which is a compromise. You should decide based on the
|
|
duration/location of each type.
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
<listitem><para>
|
|
Treat it as progressive. The interlaced parts will look interlaced,
|
|
and some of the interlaced fields will have to be dropped, resulting
|
|
in a bit of uneven jumpiness. You can use a postprocessing filter if
|
|
you want to, but it may slightly degrade the progressive parts.
|
|
</para>
|
|
|
|
<para>
|
|
This option should definitely not be used if you want to eventually
|
|
display the video on an interlaced device (with a TV card, for
|
|
example). If you have interlaced frames in a 23.976 frames per
|
|
second video, they will be telecined along with the progressive
|
|
frames. Half of the interlaced "frames" will be displayed for three
|
|
fields' duration (3/59.94 seconds), resulting in a flicking
|
|
"jump back in time" effect that looks quite bad. If you
|
|
even attempt this, you <emphasis role="bold">must</emphasis> use a
|
|
deinterlacing filter like <option>lb</option> or
|
|
<option>l5</option>.
|
|
</para>
|
|
|
|
<para>
|
|
It may also be a bad idea for progressive display, too. It will drop
|
|
pairs of consecutive interlaced fields, resulting in a discontinuity
|
|
that can be more visible than with the second method, which shows
|
|
some progressive frames twice. 29.97 frames per second interlaced
|
|
video is already a bit choppy because it really should be shown at
|
|
59.94 fields per second, so the duplicate frames don't stand out as
|
|
much.
|
|
</para>
|
|
|
|
<para>
|
|
Either way, it's best to consider your content and how you intend to
|
|
display it. If your video is 90% progressive and you never intend to
|
|
show it on a TV, you should favor a progressive approach. If it's
|
|
only half progressive, you probably want to encode it as if it's all
|
|
interlaced.
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem><para>
|
|
Treat it as interlaced. Some frames of the progressive parts will
|
|
need to be duplicated, resulting in uneven jumpiness. Again,
|
|
deinterlacing filters may slightly degrade the progressive parts.
|
|
</para></listitem>
|
|
|
|
</itemizedlist>
|
|
</sect3>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="menc-feat-telecine-footnotes">
|
|
<title>Footnotes</title>
|
|
<orderedlist>
|
|
<listitem><formalpara>
|
|
<title>About cropping:</title>
|
|
<para>
|
|
Video data on DVDs are stored in a format called YUV 4:2:0. In YUV
|
|
video, luma ("brightness") and chroma ("color")
|
|
are stored separately. Because the human eye is somewhat less
|
|
sensitive to color than it is to brightness, in a YUV 4:2:0 picture
|
|
there is only one chroma pixel for every four luma pixels. In a
|
|
progressive picture, each square of four luma pixels (two on each
|
|
side) has one common chroma pixel. You must crop progressive YUV
|
|
4:2:0 to even resolutions, and use even offsets. For example,
|
|
<option>crop=716:380:2:26</option> is OK but
|
|
<option>crop=716:380:3:26 </option> is not.
|
|
</para>
|
|
</formalpara>
|
|
|
|
<para>
|
|
When you are dealing with interlaced YUV 4:2:0, the situation is a
|
|
bit more complicated. Instead of every four luma pixels in the
|
|
<emphasis>frame</emphasis> sharing a chroma pixel, every four luma
|
|
pixels in each <emphasis> field</emphasis> share a chroma
|
|
pixel. When fields are interlaced to form a frame, each scanline is
|
|
one pixel high. Now, instead of all four luma pixels being in a
|
|
square, there are two pixels side-by-side, and the other two pixels
|
|
are side-by-side two scanlines down. The two luma pixels in the
|
|
intermediate scanline are from the other field, and so share a
|
|
different chroma pixel with two luma pixels two scanlines away. All
|
|
this confusion makes it necessary to have vertical crop dimensions
|
|
and offsets be multiples of four. Horizontal can stay even.
|
|
</para>
|
|
|
|
<para>
|
|
For telecined video, I recommend that cropping take place after
|
|
inverse telecining. Once the video is progressive you only need to
|
|
crop by even numbers. If you really want to gain the slight speedup
|
|
that cropping first may offer, you must crop vertically by multiples
|
|
of four or else the inverse-telecine filter won't have proper data.
|
|
</para>
|
|
|
|
<para>
|
|
For interlaced (not telecined) video, you must always crop
|
|
vertically by multiples of four unless you use <option>-vf
|
|
field</option> before cropping.
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem><formalpara>
|
|
<title>About encoding parameters and quality:</title>
|
|
<para>
|
|
Just because I recommend <option>mbd=2</option> here doesn't mean it
|
|
shouldn't be used elsewhere. Along with <option>trell</option>,
|
|
<option>mbd=2</option> is one of the two
|
|
<systemitem class="library">libavcodec</systemitem> options that
|
|
increases quality the most, and you should always use at least those
|
|
two unless the drop in encoding speed is prohibitive (e.g. realtime
|
|
encoding). There are many other options to
|
|
<systemitem class="library">libavcodec</systemitem> that increase
|
|
encoding quality (and decrease encoding speed) but that is beyond
|
|
the scope of this document.
|
|
</para>
|
|
</formalpara>
|
|
</listitem>
|
|
|
|
</orderedlist>
|
|
|
|
</sect2>
|
|
|
|
</sect1>
|
|
|
|
</chapter>
|