blob: 5b6c1c2a679b72d209b379bb69a5016644c4f824 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>编码 -- MEncoder -- Linux下的电影编码器</TITLE>
<LINK REL="stylesheet" TYPE="text/css" HREF="../default.css">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gbk">
</HEAD>
<BODY>
<H1><A NAME="encoding">7. 用MEncoder编码</A></H1>
<P>MEncoder的全部可用选项和示例请看man page。一些实用的例子和对一些编码参数的详尽的解释请看从<A
HREF="http://mplayerhq.hu/mailman/listinfo/mplayer-users">mplayer-users</A>邮件列表中搜集来的<A
HREF="../tech/encoding-tips.txt">编码技巧</A>。搜索<A HREF="http://mplayerhq.hu/pipermail/mplayer-users/">邮件
文档</A>可以找到用MEncoder编码的各方面以及所遇到问题的丰富的讨论。</P>
<H4><A NAME="2pass">7.1 2或者3-pass的MPEG-4("DivX")编码</A></H4>
<P><U><B>2-pass编码:</B></U>名称来自这种方法实际把文件编码<I>两次</I>的事实。第一次编码(又称为<I>pass</I>)创建一些临时性的几兆的文件(*.log),
先不要删除他们(你可以把AVI删了)。在第二次编码中,将使用临时文件的比特率数据创建输出文件,最后产生的文件将有好得多的图象质量。如果这是你第一次听到这个,
你应该在网上查阅一些可用的指南。</P>
<P>这个例子演示如何把DVD编码成为2-pass的MPEG-4("DIVX")的AVI。只需要两个命令:<BR>
<CODE> rm frameno.avi</CODE> -- 删掉这个文件,它可能来自以前的3-pass编码(它会干扰当前编码)<BR>
<CODE> mencoder -dvd 2 -ovc lavc -lavcopts
vcodec=mpeg4:vpass=1 -oac copy -o movie.avi<BR>
mencoder -dvd 2 -ovc lavc -lavcopts
vcodec=mpeg4:vpass=2 -oac copy -o movie.avi</CODE></P>
<P><U><B>3-pass编码:</B></U>这是2-pass编码的扩展,对音频的编码使用一个单独的编码。这种方法提供推荐视频比特率的估计以使之能够适合CD的容量。同时,
不同于2-pass方式,音频仅仅被编码一次。操作列表:</P>
<OL>
<LI>删除冲突的临时性的文件:
<P><CODE>rm frameno.avi</CODE></P></LI>
<LI>第一次编码:
<P><CODE>mencoder <file/DVD> -ovc frameno -oac mp3lame -lameopts vbr=3 -o frameno.avi</CODE></P> <P>将创建一个只有音频的avi文件,<B>只</B>包含要求的音频流。不要忘记<CODE>-lameopts</CODE>,如果需要的话设置它。如果你对一部长的电影进行编码,
MEncoder在这个pass结束之后,将对于650Mb,700Mb,和800Mb的目标大小打印推荐的比特率值。</P></LI>
<LI>第二次编码:
<P><CODE>mencoder <file/DVD> -oac copy
-ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=<bitrate></CODE></P>
<P>这是第一次视频编码。可以选择指定在上一步结束时MEncoder打印的视频比特率。</P></LI>
<LI>第三次pass:
<P><CODE>mencoder <file/DVD> -oac copy
-ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=<bitrate></CODE></P>
<P>这是第二次视频编码。指定跟上一次编码一样的比特率除非你真的知道自己在干什么。在这次编码中,用<CODE>frameno.avi</CODE>
中的音频将被插入到目的文件中..这就全部搞定了!</P></LI>
</OL>
<H4>3-pass编码的例子:</H4>
<P><CODE> rm frameno.avi</CODE> -- 移去这个文件,它可能来自以前的3-pass编码(它会干扰当前编码)<BR>
<CODE> mencoder -dvd 2 -ovc frameno
-o frameno.avi -oac mp3lame -lameopts vbr=3<BR>
mencoder -dvd 2 -ovc lavc
-lavcopts vcodec=mpeg4:vpass=1 -oac copy -o movie.avi<BR>
mencoder -dvd 2 -ovc lavc
-lavcopts vcodec=mpeg4:vpass=2 -oac copy -o movie.avi</CODE></P>
<H2><A NAME="mpeg">7.2 编码为MPEG格式</A></H2>
<P>MEncoder可以生成MPEG(MPEG-PS)格式的输出文件。它们可能只能用于libavcodec的<I>mpeg1video</I>编解码器,因为一般播放器 -
- 除了MPlayer -- 认为MPEG文件中包含的是MPEG1视频流和MPEG1 layer 2(MP2)音频流。</P>
<P>这个特性目前来说没有什么用处,而且可能还有很多bug,其重要性在于目前MEncoder无法编码MPEG1 layer 2 (MP2)的音频,而它正是别的播放
器认为MPEG文件中应该有的。</P>
<P>要改变MEncoder的输出文件格式,可以使用<CODE>-of mpeg</CODE>选项。</P>
<P>示例:<BR>
<CODE>mencoder -of mpeg -ovc lavc -lavcopts vcodec=mpeg1video
-oac copy <other options> media.avi -o output.mpg</CODE></P>
<H2><A NAME="rescaling">7.3 电影再缩放</A></H2>
<P>把电影图象的尺寸重新设置的需要经常出现。原因可能很多,例如减小输出文件的大小,网络带宽等等,很多人甚至再把DVD或SVCD编码为到DivX
的AVI的时候也重新缩放,<B>这是错误的</B>。在这么做之前,请先阅读<A HREF="#aspect">保持屏幕高宽比</A>部分。</P>
<P>缩放过程由<I>'scale'</I>视频滤镜处理:<CODE>-vf scale=width:height</CODE>。其质量由<CODE>-sws</CODE>选项控制。如果它没有指定,
MEncoder将使用0:快速二次线性缩放。</P>
<H4>用法:</H4>
<CODE> mencoder sample-svcd.mpg -lavcopts
vcodec=mpeg4:more_options -vf scale=640:480 -sws 2 -o
output.avi</CODE></P>
<H2><A NAME="copying">7.4 流复制</A></H2>
<P>MEncoder能用两种方式处理输入流:<B>编码</B>或者<B>复制</B>他们。这部分是关于<B>复制</B>的。</P>
<UL>
<LI><B>视频流</B>(<CODE>-ovc copy</CODE>选项): 可以干的很好:)<BR>
比如,把FLI或者VIVO或者MPEG1的视频放(不是转化)到AVI文件中。当然只有MPlayer能播放这样的文件:)。而且可能在现实生活中没有任何价值。
合理使用:比如视频流复制可以用于只有音频流需要被编码的情况(比如,从非压缩的PCM编码为MP3)。</LI>
<LI><B>音频流</B>(<CODE>-oac copy</CODE>选项): 直接了当。可以把一个外部音频文件(MP3,Vorbis)合波到输出流中。
使用<CODE>-audiofile <filename></CODE>选择来实现这个功能。</LI>
</UL>
<H2><A NAME="fixing">7.5 修复索引或者交错损坏的AVI </A></H2>
<P>最容易的事情。我们简单地复制视频和音频流,并用MEncoder产生索引。当然这不能修复视频和/或者音频流中可能的错误。
这同样也可以修复交错损坏的文件,
使它们不再需要<CODE>-ni</CODE>选项。</P>
<P>命令:<CODE>mencoder -idx input.avi -ovc copy -oac copy -o output.avi</CODE></P>
<H3><A NAME="appending">7.5.1 合并多个AVI文件</A></H3>
<P>作为副产品,修复损坏的AVI文件的功能使MEncoder可以用来修复两个或多个AVI文件合并生成的文件:</P>
<P>命令:<CODE>cat 1.avi 2.avi | mencoder -noidx -ovc copy -oac copy -o output.avi -</CODE></P>
<P><B>注意:</B>这要求<CODE>1.avi</CODE>和<CODE>2.avi</CODE>使用同样的编解码器,分辨率,流速率
等等,并且至少1.avi不是损坏的。你可能需要先修复你的AVI输入文件,按照<A HREF="#fixing">上面</A>所说的方法。</P>
<H2><A NAME="libavcodec">7.6 用libavcodec编解码器族编码</A></H2>
<P><A HREF="codecs.html#libavcodec">libavcodec</A>提供简单编码许多有趣的视频和音频格式(目前其音频编码器还不支持)的方法。
你能编码下列的编码格式:</P>
<UL>
<LI>mjpeg -- Motion JPEG</LI>
<LI>h263 -- H263</LI>
<LI>h263p -- H263 Plus</LI>
<LI>mpeg4 -- DivX4</LI>
<LI>msmpeg4 -- 老的DivX</LI>
<LI>msmpeg4v2 -- Micro$oft MPEG4 V2 (DivX的又称为MP43的前辈)</LI>
<LI>rv10 -- 老的RealVideo编码格式</LI>
<LI>mpeg1video -- MPEG1视频:)</LI>
</UL>
<P>第一栏是应该在<CODE>vcodec</CODE>选项里设置的编码格式的名称,比如:<CODE>-lavcopts vcodec=msmpeg4</CODE></P>
<P>例如,对于使用MJPEG压缩:<BR>
<CODE> mencoder -dvd 2 -o title2.avi -ovc lavc
-lavcopts vcodec=mjpeg -oac copy</CODE></P>
<H2><A NAME="image_files">7.7 用输入的多幅图象文件(JPEG,PNG或TGA)进行编码</A></H2>
<P>MEncoder具有从一个或多个JPEG,PNG或TGA文件创建电影的能力。通过简单的framecopy它能创建MJPEG(Motion JPEG),
MPNG(Motion PNG )或MTGA(Motion TGA)文件。</P>
处理过程的解释:
<OL>
<LI>MEncoder使用<CODE>libjpeg</CODE><I>解码</I>输入图像(当解码PNG时将使用<B>libpng</B>)。</LI>
<LI>MEncoder接着把解码后的图象喂给所选的的视频压缩器(DivX4,Xvid,ffmpeg msmpeg4等等)。</LI>
</OL>
<H4>例子</H4>
<P><CODE>-mf</CODE>选项的解释能在man page中找到。</P>
<P><I>用当前目录中的所有JPEG文件创建DivX4文件:</I><BR>
<CODE>mencoder \*.jpg -mf on:w=800:h=600:fps=25 -ovc divx4 -o
output.avi</CODE></P></P>
<P><I>用当前目录中的一些JPEG文件创建DivX4文件:</I><BR>
<CODE>mencoder -mf on:w=800:h=600:fps=25 -ovc divx4 -o output.avi \*.jpg</CODE></P>
<P><I>用当前目录中的所有JPEG文件创建Motion JPEG(MJPEG)文件:</I><BR>
<CODE>mencoder -mf on:w=800:h=600:fps=25 -ovc copy -o output.avi \*.jpg</CODE></P>
<P><I>用当前目录中的所有PNG文件创建一个非压缩的文件:</I><BR>
<CODE>mencoder -mf on:w=800:h=600:fps=25:type=png -ovc rawrgb -o output.avi \*.png</CODE></P>
<P><B>注意:</B>宽度必须是4的整数倍,这是RAW RGB AVI格式的一个限制。</P>
<P><I>用当前目录中的所有PNG文件创建Motion PNG(MPNG)文件:</I><BR>
<CODE>mencoder -mf on:w=800:h=600:fps=25:type=png -ovc copy -o output.avi \*.png</CODE></P>
<P><I>用当前目录中的所有TGA文件创建Motion TGA(MTGA)文件:</I><BR>
<CODE>mencoder -mf on:w=800:h=600:fps=25:type=tga -ovc copy -o output.avi \*.tga</CODE></P>
<H2><A NAME="vobsub">7.8 将DVD字幕提取为Vobsub文件</A></H4>
<P>MEncoder有把DVD字幕提取到Vobsub格式的文件的能力。包括以<CODE>.idx</CODE>和<CODE>.sub</CODE>结尾的一对
文件而且通常打包在一个单一的<CODE>.rar</CODE>文档中。MPlayer能使用<CODE>-vobsub</CODE>和<CODE>-vobsubid</CODE>
选项播放它们。</P>
<P>你使用<CODE>-vobsubout</CODE>选项规定输出文件的基名称(就是不包括<CODE>.idx</CODE>或者<CODE>.sub</CODE>的后缀)和
<CODE>-vobsuboutindex</CODE>指定字幕在输出文件中的索引号。</P>
<P>如果输入不是来自DVD你必须使用<CODE>-ifo</CODE>来指明构造<CODE>.idx</CODE>文件需要的<CODE>.ifo</CODE>文件。</P>
<P>如果输入不是来自DVD而且你也没有<CODE>.ifo</CODE>文件你将需要使用<CODE>-vobsubid</CODE>选项让它了解在<CODE>.idx</CODE>
文件中放置什么样的language id。</P>
<P>如果<CODE>.idx</CODE>和<CODE>.sub</CODE>文件已经存在,每次运行将追加运行获得的字幕。因此,你应该在开始之前删掉所有东西。</P>
<H4>例子</H4>
<P><I>在进行3-pass编码的同时从DVD复制两份字幕</I><BR>
<CODE>rm subtitles.idx subtitles.sub</CODE><BR>
<CODE>mencoder -dvd 1 -vobsubout subtitles -vobsuboutindex 0
-sid 2 -o frameno.avi -ovc frameno</CODE><BR>
<CODE>mencoder -dvd 1 -oac copy -ovc divx4 -pass 1</CODE><BR>
<CODE>mencoder -dvd 1 -oac copy -ovc divx4 -pass 2 -vobsubout
subtitles -vobsuboutindex 1 -sid 5</CODE></P>
<P><I>从一个MPEG文件中复制法语字幕</I><BR>
<CODE>rm subtitles.idx subtitles.sub</CODE><BR>
<CODE>mencoder movie.mpg -ifo movie.ifo -vobsubout subtitles
-vobsuboutindex 0 -vobsuboutid fr -sid 1</CODE></P>
<H2><A NAME="aspect">7.9 保持屏幕高宽比</A></H2>
<P>DVD和SVCD(也就是MPEG1/2)文件通常包含屏幕高宽比的值,它描述播放器如何正确缩放视频流,保证人不会长鸡蛋脑袋
(ex.: 480x480 + 4:3 = 640x480)。但当编码成AVI(DivX)文件时,你必须清醒的认识到AVI的文件头中没有储存这个数据。重新缩放电影
是令人厌恶的而且消耗时间。必须有一个更好的特性!</P>
<P>下面就是。</P>
<P>MPEG4有一个特性:视频流可以包含它所需要的屏幕高宽比,没错,就跟MPEG1/2文件(DVD, SVCD)一样。遗憾的是,除了MPlayer
之外<U>没有</U>视频播放器支持这个特性。</P>
<P>这个特性只能用于<B>libavcodec</B>的<CODE>mpeg4</CODE>编解码器。牢牢记住这一点:尽管MPlayer能正确播放所创建的文件。
别的播放器还会使用错误的屏幕高宽比。</P>
<P>你应该认真的把电影上下的黑边切掉。看man page了解<CODE>cropdetect</CODE>和<CODE>crop</CODE>滤镜的使用。</P>
<H4>用法:</H4>
<P><CODE>$ 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</CODE></P>
</BODY>
</HTML>
|