2008-05-05

Linux下转换视频文件Mencoder篇

  从windows下迁移到Linux,如果你是像我一样常常要从DVD上抓取MTV再转换到手机上用的话必然离不开要转换格式与编码等等,所以就需要在Linux下处理这些问题,在Linux下一般看得到的就两个,一个是Mplayer的Mencoder另外一个是ffmpeg我这次只先用Mencoder。因为我已经把mplayer装好了。

  详细介绍man mencoder可以发现一个长达1000多行的说明文件,这里就算了,不用那种东西。需要深入学习再看。
以范例来介绍。
  首先,以一个最简单的命令为例:

mencoder test.avi -o result.avi -oac copy -ovc copy -endpos 30
这个命令的作用是将test.avi文件截取前30秒不经过重新编码输出到result.avi
注意我用颜色标注了四个不同的区域


  1. test.avi -o result.avi 这里控制输入和输出文件
  2. -oac copy 这里用于指定音频编码及其参数
  3. -ovc copy 这里用于指定视频编码及其参数
  4. -endpos 30 这里是用于指定其他全局参数
其中oac和ovc的可用编码器可以通过-oac help -ovc help查看:

在我机器上是这样的
root@rtt-desktop:~$ mencoder -ovc help

Available codecs:
copy - frame copy, without re-encoding. Doesn't work with filters.
frameno - special audio-only file for 3-pass encoding, see DOCS.
raw - uncompressed video. Use fourcc option to set format explicitly.
nuv - nuppel video
lavc - libavcodec codecs - best quality!
vfw - VfW DLLs, read DOCS/HTML/en/encoding-guide.html.
qtvideo - QuickTime DLLs, currently only SVQ1/3 are supported.
libdv - DV encoding with libdv v0.9.5
xvid - XviD encoding
x264 - H.264 encoding

root@rtt-desktop:~$ mencoder -oac help

Available codecs:
copy - frame copy, without re-encoding (useful for AC3)
pcm - uncompressed PCM audio
mp3lame - cbr/abr/vbr MP3 using libmp3lame
lavc - FFmpeg audio encoder (MP2, AC3, ...)
twolame - Twolame MP2 audio encoder
faac - FAAC AAC audio encoder
所以在通过自己的设置之下你可以让它产生出无限种变化。
下面先介绍一些基础的命令及其含义:

我们先将mencoder按块分开定义:mencoder 文件指定 音频参数 视频参数 其他参数
视频
参数
说明 
-ovc指定视频编码及其参数
-vf 指定视频滤镜,让你修改视频流及其属性,−vf help可以获取视频滤镜列表
vf的滤镜:
rectangle : draw rectangle
bmovl : Read bitmaps from a FIFO and display them in window
crop : cropping
expand : expanding & osd
pp : postprocessing
scale : software scaling
vo : libvo wrapper
format : force output format
noformat : disallow one output format
yuy2 : fast YV12/Y422p -> YUY2 conversion
flip : flip image upside-down
rgb2bgr : fast 24/32bpp RGB<->BGR conversion
rotate : rotate
mirror : horizontal mirror
palette : 8bpp indexed (using palette) -> BGR 15/16/24/32 conversion
lavc : realtime mpeg1 encoding with libavcodec
lavcdeint : libavcodec's deinterlacing filter
pp7 : postprocess 7
dvbscale : calc Y scaling for DVB card
cropdetect : autodetect crop size
test : test pattern generator
noise : noise generator
yvu9 : fast YVU9->YV12 conversion
eq : soft video equalizer
eq2 : Software equalizer
halfpack : yuv planar 4:2:0 -> packed 4:2:2, half height
dint : drop interlaced frames
1bpp : 1bpp bitmap -> YUV/BGR 8/15/16/32 conversion
2xsai : 2xSai BGR bitmap 2x scaler
unsharp : unsharp mask & gaussian blur
swapuv : UV swapper
il : (de)interleave
fil : fast (de)interleaver
boxblur : box blur
sab : shape adaptive blur
smartblur : smart blur
perspective : perspective correcture
down3dright : convert stereo movie from top-bottom to left-right field
field : extract single field
denoise3d : 3D Denoiser (variable lowpass filter)
hqdn3d : High Quality 3D Denoiser
detc : de-telecine filter
telecine : telecine filter
tinterlace : temporal field interlacing
tfields : temporal field separation
ivtc : inverse telecine, take 2
ilpack : 4:2:0 planar -> 4:2:2 packed reinterlacer
dsize : reset displaysize/aspect
decimate : near-duplicate frame remover
softpulldown : mpeg2 soft 3:2 pulldown
pullup : pullup (from field sequence to frames)
filmdint : Advanced inverse telecine filer
framestep : Dump one every n / key frames
tile : Make a single image tiling x/y images
delogo : simple logo remover
remove-logo : Removes a tv logo based on a mask image.
hue : hue changer
spp : simple postprocess
uspp : ultra simple/slow postprocess
fspp : fast simple postprocess
qp : QP changer
mcdeint : motion compensating deinterlacer
geq : generic equation filter
yuvcsp : yuv colorspace converter
kerndeint : Kernel Deinterlacer
rgbtest : rgbtest
phase : phase shift fields
divtc : inverse telecine for deinterlaced video
harddup : resubmit duplicate frames for encoding
softskip : soft (post-filter) frame skipping for encoding
screenshot : screenshot to file
ass : Render ASS/SSA subtitles
yadif : Yet Another DeInterlacing Filter
blackframe : detects black frames
ow : overcomplete wavelet denoiser

−vf <滤镜>=help可以获取相应滤镜的信息
此外
,视频滤镜以列表的形式维护。有一些命令用于维护滤镜列表。
  • −vf-add <滤镜1[,滤镜2,...]>
    在滤镜列表尾部加上参数中所给的滤镜。
  • −vf-pre <滤镜1[,滤镜2,...]>
    在滤镜列表头部加上参数中所给的滤镜。
  • −vf-del <索引号1[,索引号2,...]>
    删除位于指定索引号上的滤镜。索引号起始为0,负数表示从列表尾部开始寻址(-1表示最后一个)。
  • −vf-clr
    完全清空滤镜列表。 Completely empties the filter list.
    如果滤镜支持,你可以通过参数的名字访问参数。
vf使用滤镜的时候用法是:
-vf <滤镜1名>=参数1:参数2,<滤镜2名>=参数1:参数2,…

貌似vf参数只有在有重编码的情况下有用。比如:
mencoder "/home/rr/video/test/testt.avi" -o "/home/rr/video/res.avi" -oac copy -ovc xvid -xvidencopts bitrate=200 -vf flip,crop=320:240 -endpos 12

结果就是简单的重编码以后挖出一块320×240的倒置的影像

相关的中文意义如果读不懂的话可以参见http://www.mplayerhq.hu/DOCS/man/zh/mplayer.1.html#%E8%A7%86%E9%A2%91%E6%BB%A4%E9%95%9C
因为这个网站实在慢的可以,我之后已经将它艰难的转了过来:
关于视频滤镜这一章可以参看http://rhingheart.blogspot.com/2008/05/mplayerpart3.html
同理,有视频滤镜比必然有音频滤镜:
-af
同样可使用-af help命令查看信息,不过我的机器上这样做无效
此外还有Mencoder的通用编码选项:
−audio−delay

−audio−density <1−50>

−audio−preload <0.0−2.0>
−fafmttag
−ffourcc
−force
−avi
−aspect <0.2−3.0>

−frameno−file (不推荐使用)

−hr
−edl
−seek

−info (只用于AVI)

−noautoexpand

−noencodedups

−noodml(仅用于−of avi的情况下)

−noskip

−o

−oac

−of (BETA测试版代码!)

−ofps

−passlogfile
−skiplimit
−vobsubout

−vobsuboutid

−vobsuboutindex

相应说明参看官方文档,也可以参照:
http://rhingheart.blogspot.com/2008/05/mplayerpart4.html
在-ovc中指定了任何编码器的话都有其专用的编码选项:
可以使用
opts
来指定参数如用xvid编码视频则可以用
-ovc xvid -xvidencopts …
来指定参数。
可用的有:lavc、xvidenc、lame、toolame、twolame、nuv、xvfw、faac、 x264enc、mpeg、lavf

具体信息可参看mencoder相关文档
或:这个
http://rhingheart.blogspot.com/2008/05/mplayerpart4.html



以下就是一些我自己的实例了:

比如我现在在为我手机上播放的动画测试最佳编码状况我分别使用xvid,x.264,和libavcodec
用了下面三条命令:

mencoder "/home/users/Downloads/BT/BD05.rmvb" -o "/home/users/video/BDrets.avi" -oac mp3lame -lameopts vbr=3:q=5 -ovc xvid -xvidencopts fixed_quant=6:me_quality=5:cartoon -vf scale=320:-3 -endpos 30

mencoder "/home/users/Downloads/BT/BD05.rmvb" -o "/home/users/video/BDrets264.avi" -oac mp3lame -lameopts vbr=3:q=5 -ovc x264 -x264encopts crf=23.5 -vf scale=320:-3 -endpos 30

mencoder "/home/users/Downloads/BT/BD05.rmvb" -o "/home/users/video/BDretslvac.avi" -oac mp3lame -lameopts vbr=3:q=5 -ovc lavc -lavcopts vcodec=libx264:vqscale=6 -vf scale=320:-3 -endpos 30

   三条命令只修改了其视频编码部分以进行对比,我不使用固定码率,这样能够使得编码结果性价比更高。可以看到第一部分文件输入输出。第二部分我指定音频, 这里用的是mp3lame编码器,并且用vbr=3的abr平均可变比特方式编码。第三部分我指定视频,这里用的是三种:xvid,x.264和lavc 中的.264编码器,并且指定质量水平,其中用xvid我还使用了fixed_quant固定量化器,并且用me_quality指定运动估计子系统以提 升效果,由于我转换的是动画,姑这个还增加了cartoon选项。第四部分我用视频滤镜调用scale软缩放图像参数320:-3是按照原始信息自动调整 宽高比。
  从结果看,直接用xvid编码的视频花费的码率是240Kbps,而.264编码的在同样码率下比它看上去好得多了,至于vcodec虽然号称质量最好,不过貌似我这个设定花了600Kbps左右的码率,实在觉得不适合用在转手机片上。另外,经测试,.264编码在我的手机上解码速度极慢,果然是性能不足阿。

另外还有不少技巧:
比如加黑边用expand滤镜,调整视频和音频不同步用delay等等,不过这些只要知道了命令的基本格式之后查文档就可以了。祝你好运!



-------------------
更新:
找到一篇有内容的某个选项的介绍:

Quantization量化选项(关键的关键就在这里!)   , U# \* S% I: ?* h/ L. M `( ]8 d
量化器级别(quantizer level)即Q值越高画面细节越丰富,但是在低码率下越高的量化器级别,会带来越低的画面质量,Q 值越小,质量越好,码率越大;Q 值越大,质量越差,码率越小。(实际上,它的原始概念更复杂,我们干脆简单地认为1就是100%原质量,31就是1/31的原质量好了)。P- frame(即未来单项预测帧)建议设置在1--15之间,(它的作用是只储存与之前一个已解压画面的差值。即仅仅描述它与前一帧的区别)。I- frame(即关键帧)的Q值只用能作用于2pass-second压制上,在VirtualDub被标示为 [K],关键帧是构成一个帧组(GOP,Group of Picture)的第一个帧。I-Frame 保留了一个场景的所有信息(Keyframe原意是指可以单独解码、用于同步的frame,不过在MPEG系统中只有I-frame有这个特性,因为BF 和PF都是预测帧,要靠I-Frame来还原)。B-frame(即双向预测帧)除了参考之前解压过了的画面外,亦会参考后面一帧中的画面信息。这三个设 置的范围都是1-31,应该注意的是在场景昏暗的条件下不要让B-frame过低。 ) 7 B: ^7 S2 x! o# o

R9 U" z' r6 k I8 A
min_iquant=1——IF的量化最低值(取值范围在1-31之间)
4 ?/ Y2 @; B# s- Mmax_iquant=10——IF的量化最高值(取值范围在1-31之间) 9 `# U, ?( y. ~& o ^
min_pquant=1——PF的量化最低值(取值范围在1-31之间)
0 }* i) t1 f) jmax_pquant=10——PF的量化最高值(取值范围在1-31之间)
: `! {) q9 L: O2 ^" F ]min_bquant=1——BF的量化最低值(取值范围在1-31之间)
3 h) A9 u, t# t- Gmax_bquant=30——BF的量化最低值(取值范围在1-31之间)
-----------------------------------------------------
更新2:
介绍以下DVDRip。
我这里抓的是动感新势力的dvd盘。没有版权保护,我平常也不看电影,所以也找不到有版权保护的光盘。因此这是在无防拷贝措施的情况下抓的。
比如我这期的动新64期中想要抓一个MV,转到手机上。
首先确定文件:
播放以下就可以了:
gmplayer dvd://12
但是你会发现超级严重的interlace,就是拉丝现象。
这个时候你就需要加参数来去除它了,否则简直就是自虐。
查了以下文档,经过测试:

gmplayer dvd://12 -vf detc=am

gmplayer dvd://12 -vf detc=fr

的效果都不错。
本来想截图的,不过mplayer截出来的图看不出变化。
对了,要截图只需要加 -vf screenshot就可以了。

接下来自然就是拷贝出来了,如果重编码的话不仅浪费时间而且多编码一次画质就削弱一次,所以我们直接拷贝
mencoder dvd://12 -o /home/username/video/output.avi -oac copy -ovc copy

之后重编码的时候记得要加上去拉丝的选项,我就用这个:
mencoder beautiful_world.avi -o bbt.avi -oac copy -ovc xvid -xvidencopts fixed_quant=3:me_quality=6:cartoon -vf detc=am

---------------------------------------------------------------------
更新3:
关于查看文件信息可以用:
mplayer -identify ./filename.avi -nosound -vc XX -vo null
  其中
./filename.avi 只是文件名, -nosound 禁播声音 -vc XX其实是随便强制指定一个不存在的解码器来禁用视频播放

关于将字幕编码到视频中:
SUB内嵌字幕:

mencoder \[DIAMOND\]\[水果篮子.For.Fruit.Basket\]\[AVC_OGG\].mkv -o /home/example/video/test.avi -ovc xvid -xvidencopts fixed_quant=5.5:me_quality=6:cartoon -oac mp3lame -lameopts vbr=0:br=64 -ofps 20 -sid 0 -subpos 95 -spualign 2 -spuaa 4 -vf scale=320:-3

  这个是我现在在转换的一个例子,文件内嵌了三种字幕,编码设定方面这里不介绍,请看前面,-sid 0是我使用id为0的字幕, -subpos 95指定字幕的位置为从顶端向下95%的位置,-spualign 2是用来然字幕底部对齐,如果缺少这个字幕不会对齐, 之后由于我缩放了视频,所以为了保证sub字幕的视觉效果用了 -spuaa 4这个参数,4是最好的缩放效果,如果是普通字幕可以用3来提升一定的速度。这些参数的具体值的意义请查看对应手册,或者上面连接到的说明的文章。
-spualign 2 -spuaa 4均是用来操作DVD字幕的。


外挂字幕:
  很遗憾的是到现在仍然还是没有去下一部外挂字幕的电影。。没爱吧。。不过发现即使是内嵌的字幕流只要原来是文本的仍然能够使用外挂字幕的处理参数来处理。这里就介绍下:
mencoder "/media/diskF/DOWNLOAD/Emule/Incoming/[动心MTV][LAPIS][地狱少女.-.逆蝶].mkv -o ./test.avi -oac mp3lame -lameopts vbr=0:br=64 -ovc xvid -xvidencopts fixed_quant=6:me_quality=6:cartoon -vf scale=320:-3,expand=0:-18:0:0:1 -ofps 20 -sid 0 -subfont ./msyh.ttf -subfont-autoscale 1 −subfont−outline 2 -subpos 95
解释下:其他地方差不多,关键看蓝色的那段,现说明,我是为了把字幕弄到黑边里面所以这样写的,expand那句放在scale后面,让影片缩放完后再来处理添加黑边的效果可以看下图:


未加黑边

加了18个像素的黑边。注意我用的expand参数中最后的那个1,如果没有用的话是默认不开启字幕/OSD支持的,也就是前面的字幕会留下来和后面的重叠了,结果就是下面这样:

接下来是后面的,subfont指定的是字幕的字体,你可以自己任选。
subfont-autoscale 1就是按照高度缩放字幕,因为我是要把源视频缩小所以必须要这个,否则字幕就大的可以了。。。。
-subfont-outline 2是用来设定字体边框宽度的,如果不设的话字体没办法按照我们给的参数-subpos 95显示在正确的位置。总的来说,简单的字体配置也就是基本如此。
2008-6-14日更新完毕


-----------------------------------------------------------------
更新关于flv转换的信息
一般来说,只有在有特殊需要的时候才会去转flv,今天就碰到了。顺便就写下来。
基本上,普通的文件要转的话十分方便,参考这个代码:
mencoder /media/diskF/DOWNLOAD/disk/pal4/2L.avi -o /home/ulysess/video/2L.avi -of lavf -lavfopts format=flv -oac mp3lame -lameopts abr:br=32 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=600:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=640:-3 -ofps 15
-of 指定lavf输出,并且在lavfopts里设定格式为flv,其他地方都很熟了。之后的lavcopts里面的参数大部分直接参考mplayer的文档的。

不过我自己在转换的过程中遇到问题,所以点把音频分离出来:
mencoder -oac copy -ovc copy -of rawaudio -o test.audio 2L.avi
之后再用分离的音频和原文件的视频转换就能解决问题,我也觉得奇怪为什么这样:
mencoder -oac copy -ovc lavc -lavcopts vcodec=flv:vbitrate=600:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=640:-3 -ofps 15 -audiofile ./test.audio /media/diskF/DOWNLOAD/disk/pal4/2L.AVI -o final.flv -of lavf -lavfopts format=flv

2008-8-1更新完毕
--------------------------------------------------------------------

更新:外挂字幕的转换
基本上,最近要截一段mv,所以遇到了这个,mencoder有一个怀习惯就是,一旦字幕的格式不能检测出来就不会加载字幕,但是在mplayer下,即使检测不出来仍然可以播放,所以,在我们转换的时候还是做到标准为好。
原来我的ass字幕就不能被所有字幕编辑器检测,不过可以正常播放,所以这次遇到了麻烦,最后通过百般修改之下保存成了ssa字幕,终于mencoder认得了,接下来就简单了:
mencoder testpale.avi -o PaleCocoon.avi -oac mp3lame -lameopts vbr=0:br=48 -ovc xvid -xvidencopts fixed_quant=6:me_quality=5:cartoon -sub testt.ssa -utf8 -subfont /usr/share/fonts/truetype/deffonts/msyh.ttf -subdelay 5 -vf scale=320:-3,expand=0:-26:0:0:1 -ofps 20 -subfont-text-scale 3 -subfont-outline 1 -subpos 98

注意蓝色部分,关键在此,所有文本字幕都可以用 -sub参数直接指定,不过这个时候显示中文可能乱码,所以解决方法是加一个-utf8 或-unicode因为我的字幕文件是utf8编码的,所以就用它了。之后之所以用subfont-text-scale来指定百分比是因为文本字幕一般在缩放的情况下很容易变得很难看,所以用这个调整会比自动缩放好一些。

2008-8-11更新完毕

----------------------------------------------------------------------
更新:

Mencoder的多视频拼接、截图和转换图片为视频:

之前一直都认为mencoder不能做到合并视频,不过今天在搜索ffmpeg的资料的时候却出人意料的找到这个资料,目前家里没有装linux,不方便测试。先记下吧:

多视频拼接:

mencoder -oac copy -ovc copy -idx -o output.avi video1.avi video2.avi
video3.avi

  • 如果在视频文件中没有找到索引的话,那么 -idx 选项会要求 mencoder 建立它。
  • -o 选项指定输出文件的名称。最后几个参数为需要合并的几个视频片段。

定点定帧截图的方法:

mplayer -ss START_TIME -noframedrop -nosound -vo jpeg -frames N
NAME_OF_VIDEO_FILE

-frames后面指定截几帧

转换图片为视频:

mencoder \*.jpg -mf on:w=800:h=600:fps=25 -ovc divx4 -o output.avi

将当前目录下的所有jpg文件转换成一个divx4编码的视频。

本次更新参考文章:http://www.fwolf.com/blog/post/251

2009-2-4日更新完毕

---------------------------------------------------------------------------------------

本篇不再更新,新内容新开一帖,点此观看::::::::::::
/*-----------------------------------------------------*/
*原创文章,转载请保留指向本文的连接
/*-----------------------------------------------------*/

没有评论: