编码 -- MEncoder -- Linux下的电影编码器

# 7. 用MEncoder编码

MEncoder的全部可用选项和示例请看man page。一些实用的例子和对一些编码参数的详尽的解释请看从mplayer-users邮件列表中搜集来的编码技巧。搜索邮件 文档可以找到用MEncoder编码的各方面以及所遇到问题的丰富的讨论。

#### 7.1 2或者3-pass的MPEG-4("DivX")编码

2-pass编码：名称来自这种方法实际把文件编码两次的事实。第一次编码(又称为pass)创建一些临时性的几兆的文件(*.log)， 先不要删除他们(你可以把AVI删了)。在第二次编码中，将使用临时文件的比特率数据创建输出文件，最后产生的文件将有好得多的图象质量。如果这是你第一次听到这个， 你应该在网上查阅一些可用的指南。

这个例子演示如何把DVD编码成为2-pass的MPEG-4("DIVX")的AVI。只需要两个命令：
`rm frameno.avi` -- 删掉这个文件，它可能来自以前的3-pass编码(它会干扰当前编码)
`mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -oac copy -o movie.avi
mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=2 -oac copy -o movie.avi`

3-pass编码：这是2-pass编码的扩展，对音频的编码使用一个单独的编码。这种方法提供推荐视频比特率的估计以使之能够适合CD的容量。同时， 不同于2-pass方式，音频仅仅被编码一次。操作列表：

1. 删除冲突的临时性的文件：

   `rm frameno.avi`

2. 第一次编码：

   `mencoder <file/DVD> -ovc frameno -oac mp3lame -lameopts vbr=3 -o frameno.avi`

   将创建一个只有音频的avi文件，只包含要求的音频流。不要忘记`-lameopts`，如果需要的话设置它。如果你对一部长的电影进行编码， MEncoder在这个pass结束之后，将对于650Mb，700Mb，和800Mb的目标大小打印推荐的比特率值。

3. 第二次编码：

   `mencoder <file/DVD> -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=<bitrate>`

   这是第一次视频编码。可以选择指定在上一步结束时MEncoder打印的视频比特率。

4. 第三次pass：

   `mencoder <file/DVD> -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=<bitrate>`

   这是第二次视频编码。指定跟上一次编码一样的比特率除非你真的知道自己在干什么。在这次编码中，用`frameno.avi` 中的音频将被插入到目的文件中..这就全部搞定了！

#### 3-pass编码的例子：

`rm frameno.avi` -- 移去这个文件，它可能来自以前的3-pass编码(它会干扰当前编码)
`mencoder dvd://2 -ovc frameno -o frameno.avi -oac mp3lame -lameopts vbr=3
mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -oac copy -o movie.avi
mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=2 -oac copy -o movie.avi`

## 7.2 编码为MPEG格式

MEncoder可以生成MPEG(MPEG-PS)格式的输出文件。它们可能只能用于libavcodec的mpeg1video编解码器，因为一般播放器 - - 除了MPlayer -- 认为MPEG文件中包含的是MPEG1视频流和MPEG1 layer 2(MP2)音频流。

这个特性目前来说没有什么用处，而且可能还有很多bug，其重要性在于目前MEncoder无法编码MPEG1 layer 2 (MP2)的音频，而它正是别的播放 器认为MPEG文件中应该有的。

要改变MEncoder的输出文件格式，可以使用`-of mpeg`选项。

示例：
`mencoder -of mpeg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy <other options> media.avi -o output.mpg`

## 7.3 电影再缩放

把电影图象的尺寸重新设置的需要经常出现。原因可能很多，例如减小输出文件的大小，网络带宽等等，很多人甚至再把DVD或SVCD编码为到DivX 的AVI的时候也重新缩放，这是错误的。在这么做之前，请先阅读保持屏幕高宽比部分。

缩放过程由'scale'视频滤镜处理：`-vf scale=width:height`。其质量由`-sws`选项控制。如果它没有指定， MEncoder将使用0：快速二次线性缩放。

#### 用法:

`mencoder sample-svcd.mpg -lavcopts vcodec=mpeg4:more_options -vf scale=640:480 -sws 2 -o output.avi`

## 7.4 流复制

MEncoder能用两种方式处理输入流：编码或者复制他们。这部分是关于复制的。

- 视频流(`-ovc copy`选项)： 可以干的很好:)
  比如，把FLI或者VIVO或者MPEG1的视频放(不是转化)到AVI文件中。当然只有MPlayer能播放这样的文件：)。而且可能在现实生活中没有任何价值。 合理使用：比如视频流复制可以用于只有音频流需要被编码的情况(比如，从非压缩的PCM编码为MP3)。
- 音频流(`-oac copy`选项)： 直接了当。可以把一个外部音频文件(MP3，Vorbis)合波到输出流中。 使用`-audiofile <filename>`选择来实现这个功能。

## 7.5 修复索引或者交错损坏的AVI

最容易的事情。我们简单地复制视频和音频流，并用MEncoder产生索引。当然这不能修复视频和/或者音频流中可能的错误。 这同样也可以修复交错损坏的文件， 使它们不再需要`-ni`选项。

命令：`mencoder -idx input.avi -ovc copy -oac copy -o output.avi`

### 7.5.1 合并多个AVI文件

作为副产品，修复损坏的AVI文件的功能使MEncoder可以用来修复两个或多个AVI文件合并生成的文件：

命令：`cat 1.avi 2.avi | mencoder -noidx -ovc copy -oac copy -o output.avi -`

注意：这要求`1.avi`和`2.avi`使用同样的编解码器，分辨率，流速率 等等，并且至少1.avi不是损坏的。你可能需要先修复你的AVI输入文件，按照上面所说的方法。

## 7.6 用libavcodec编解码器族编码

libavcodec提供简单编码许多有趣的视频和音频格式(目前其音频编码器还不支持)的方法。 你能编码下列的编码格式：

- mjpeg -- Motion JPEG
- h263 -- H263
- h263p -- H263 Plus
- mpeg4 -- DivX4
- msmpeg4 -- 老的DivX
- msmpeg4v2 -- Micro$oft MPEG4 V2 (DivX的又称为MP43的前辈)
- rv10 -- 老的RealVideo编码格式
- mpeg1video -- MPEG1视频：)

第一栏是应该在`vcodec`选项里设置的编码格式的名称，比如：`-lavcopts vcodec=msmpeg4`

例如，对于使用MJPEG压缩：
`mencoder dvd://2 -o title2.avi -ovc lavc -lavcopts vcodec=mjpeg -oac copy`

## 7.7 用输入的多幅图象文件(JPEG，PNG或TGA)进行编码

MEncoder具有从一个或多个JPEG，PNG或TGA文件创建电影的能力。通过简单的framecopy它能创建MJPEG(Motion JPEG)， MPNG(Motion PNG )或MTGA(Motion TGA)文件。

处理过程的解释：

1. MEncoder使用`libjpeg`解码输入图像(当解码PNG时将使用libpng)。
2. MEncoder接着把解码后的图象喂给所选的的视频压缩器(DivX4，Xvid，ffmpeg msmpeg4等等)。

#### 例子

`-mf`选项的解释能在man page中找到。

用当前目录中的所有JPEG文件创建DivX4文件：
`mencoder \*.jpg -mf on:w=800:h=600:fps=25 -ovc divx4 -o output.avi`

用当前目录中的一些JPEG文件创建DivX4文件：
`mencoder -mf on:w=800:h=600:fps=25 -ovc divx4 -o output.avi \*.jpg`

用当前目录中的所有JPEG文件创建Motion JPEG(MJPEG)文件：
`mencoder -mf on:w=800:h=600:fps=25 -ovc copy -o output.avi \*.jpg`

用当前目录中的所有PNG文件创建一个非压缩的文件：
`mencoder -mf on:w=800:h=600:fps=25:type=png -ovc rawrgb -o output.avi \*.png`

注意：宽度必须是4的整数倍，这是RAW RGB AVI格式的一个限制。

用当前目录中的所有PNG文件创建Motion PNG(MPNG)文件：
`mencoder -mf on:w=800:h=600:fps=25:type=png -ovc copy -o output.avi \*.png`

用当前目录中的所有TGA文件创建Motion TGA(MTGA)文件：
`mencoder -mf on:w=800:h=600:fps=25:type=tga -ovc copy -o output.avi \*.tga`

## 7.8 将DVD字幕提取为Vobsub文件

MEncoder有把DVD字幕提取到Vobsub格式的文件的能力。包括以`.idx`和`.sub`结尾的一对 文件而且通常打包在一个单一的`.rar`文档中。MPlayer能使用`-vobsub`和`-vobsubid` 选项播放它们。

你使用`-vobsubout`选项规定输出文件的基名称(就是不包括`.idx`或者`.sub`的后缀)和 `-vobsuboutindex`指定字幕在输出文件中的索引号。

如果输入不是来自DVD你必须使用`-ifo`来指明构造`.idx`文件需要的`.ifo`文件。

如果输入不是来自DVD而且你也没有`.ifo`文件你将需要使用`-vobsubid`选项让它了解在`.idx` 文件中放置什么样的language id。

如果`.idx`和`.sub`文件已经存在，每次运行将追加运行获得的字幕。因此，你应该在开始之前删掉所有东西。

#### 例子

在进行3-pass编码的同时从DVD复制两份字幕
`rm subtitles.idx subtitles.sub`
`mencoder dvd://1 -vobsubout subtitles -vobsuboutindex 0 -sid 2 -o frameno.avi -ovc frameno`
`mencoder dvd://1 -oac copy -ovc divx4 -pass 1`
`mencoder dvd://1 -oac copy -ovc divx4 -pass 2 -vobsubout subtitles -vobsuboutindex 1 -sid 5`

从一个MPEG文件中复制法语字幕
`rm subtitles.idx subtitles.sub`
`mencoder movie.mpg -ifo movie.ifo -vobsubout subtitles -vobsuboutindex 0 -vobsuboutid fr -sid 1`

## 7.9 保持屏幕高宽比

DVD和SVCD(也就是MPEG1/2)文件通常包含屏幕高宽比的值，它描述播放器如何正确缩放视频流，保证人不会长鸡蛋脑袋 (ex.: 480x480 + 4:3 = 640x480)。但当编码成AVI(DivX)文件时，你必须清醒的认识到AVI的文件头中没有储存这个数据。重新缩放电影 是令人厌恶的而且消耗时间。必须有一个更好的特性！

下面就是。

MPEG4有一个特性：视频流可以包含它所需要的屏幕高宽比，没错，就跟MPEG1/2文件(DVD, SVCD)一样。遗憾的是，除了MPlayer 之外没有视频播放器支持这个特性。

这个特性只能用于libavcodec的`mpeg4`编解码器。牢牢记住这一点：尽管MPlayer能正确播放所创建的文件。 别的播放器还会使用错误的屏幕高宽比。

你应该认真的把电影上下的黑边切掉。看man page了解`cropdetect`和`crop`滤镜的使用。

#### 用法：

`$ mencoder sample-svcd.mpg -ovc lavc -lavcopts vcodec=mpeg4:aspect=16.0/9.0 -vf crop=714:548:0:14 -oac copy -o output.avi`