查看完整版本: 用MEncoder编码

cncn 2007-12-14 14:42

用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'视频滤镜处理:-vop scale=width:height。其质量由-sws选项控制。如果它没有指定, MEncoder将使用0:快速二次线性缩放。
用法:
    mencoder sample-svcd.mpg -lavcopts vcodec=mpeg4:more_options -vop 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 -vop crop=714:548:0:14 -oac copy -o output.avi

满囤 2008-1-14 14:06

用mencoder进行任意视频格式转换成flv


在命令行下输入此行代码:

mencoder file_of_input -o file_of_output -of lavf  -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050

关于命令中的一些参数,解释如下:

-o  是输出文件路径;
-of lavf:是输出文件格式,这里不是flv而是lavf,是因为flv属于libavformat;

-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames:-lavfopts表示对lavf进行一些设置,设置的内容就是i_certify_that_my_video_stream_does_not_use_b_frames,翻译成中文就是:我确定,我的视频不用B frames,对于转换flv格式,最好加上这个参数,否则可能会报错.

-oac mp3lame:oac=output audio codec,输出音频编码器,这里用的mp3lame;

     -lameopts abr:br=56:lame options,是专门针对mp3lame的参数设置,abr:br=56,是设置音频比特率为56(比特率:每秒钟输出的音频大小,单位kb/s);

     -ovc lavc:ovc=output video codec,输出视频编码器,lavc表示one of libavcodec’s video codec,输出格式为libavformat之一,编码器当然也是libavcodec之一啦,至于libavodec里都有哪些编码器,可以查看 Mplayer的官方文档;

    -lavcoptsvcodec=flv:vbitrate=500:mbd=2:mv0:v4mv:trell:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1:对lavc进行一些设置,详细介绍如下:

     vcodec=flv:指定视频编码器为flv;

     vbitrate=500:指定视频比特率为500,这个参数很重要,vbitrate大了可以让视频品质增加,但会让文件变的很大(可以参考flash8自带的转换工具的参数:低品质为150kb/s,中等品质为400kb/s,高品质为700kb/s)。

     mbd:宏模块选择算法,值为0~2默认为0,值越大转换越缓慢,但在品质和文件大小方面有好处;

     mv0:编译每个宏模块并选择最好的一个,当mbd=0时无效;

     v4mv:会稍微增加品质,mbd>0时效果更明显;

     trell:量子化网格搜索,对每8×8block找到最优化编码;

     cbp:只能和trell一期使用,评估失真的图像块编码;

     last_pred=3:与上一帧相比的移动数量预测,值为0~99,1~3比较合适,大于3时对品质的提高已经无关紧要,但却会降低速度;

     dia=4:移动搜索范围,值为-99~6,对于快速转换,-1是个不错的值,如果不是很重视速度,可以考虑2~4;

     cmp=6:值为1~2000,默认为0,设置用于全象素移动预算的比较函数

     vb_strategy=1:对动作很大的场景会有帮助,对有些视频,设置vmax_b_frames会有损品质,加上vb_strategy=1会好点。

     以上是对-lavcopts的详细解释,接下来继续说明mencoder的参数:

     -vf scale=512:-3:-vf表示视频格式,scale是缩放,512:-3表示强制将宽度设置为512,高度写为-3表示保持高宽比,也可以设置为 -1或-2,具体表示什么,有兴趣的可以尝试一下。如果要强制转化为统一大小,可以直接写-vf scale=640:480,但笔者个人建议用-3来保持高宽比。-vf里还有expand和crop参数,例如:-vf scale=512:384,expand=512:384:::1,crop=512:384:0:0,expand表示膨胀,crop表示裁剪;

     -ofps 12:输出视频的帧频,一般,用于flash播放的视频帧频高了没有没有意义,反而会增加视频文件大小,但如果ofps设置的不合适,比如源视频帧频不是ofps的整数倍,可能会导致转换后的视频、音频不同步,似乎可以将这一参数改为-noskip来解决这一问题;   

    -srate 22050:音频采样率一般为22050或44100。

    对于转换flv格式,lavsopts的设置比较重要.

feilongsky 2008-12-5 10:15

今天用到
页: [1]
查看完整版本: 用MEncoder编码