Chinaunix首页 | 论坛 | 博客
  • 博客访问: 659064
  • 博文数量: 205
  • 博客积分: 7891
  • 博客等级: 少将
  • 技术积分: 2168
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-29 13:16
文章分类

全部博文(205)

文章存档

2015年(4)

2014年(5)

2013年(1)

2012年(4)

2011年(51)

2010年(86)

2009年(45)

2008年(9)

分类: 嵌入式

2010-05-26 13:54:00


一:mplayer 和 mencoder介绍

    MPlayer
       是一个电影播放器,它可以在很多系统上运行.它原生支持播放MPEG/VOB,AVI,Ogg/OGM,VIVO,ASF/WMA/WMV,QT/MOV /MP4,RealMedia,Matroska,NUT,NuppelVideo,FLI,YUV4MPEG,FILM,RoQ,PVA文件,也支持 Win32的编码解码器.你可以观看VCD,SVCD,DVD,3ivx,DivX 3/4/5甚至WMV影片.MPlayer是一个开源项目,通过GNUv2授权.这就说明你可以自由的使用和拷贝这个软件.你也可以对软件进行修改,而发 布你自己修改后的程序.但是你也必须公布你的源代码.

   mencoder
   MEncoder(MPlayer's Movie Encoder)是一个简单的电影编码器,设计用来把MPlayer可以播放的电影 (AVI/ASF/OGG/DVD/VCD/VOB/MPG/MOV/VIV/FLI/RM/NUV/NET/PVA)编码成别的MPlayer可以播放 的格式。它可以使用各种编解码器进行编码,例如 DivX4(1或2 passes),libavcodec, PCM/MP3/VBR MP3音频。同时也有强大的插件系统用于控制视频。

二:mplayer 移植(mipsel)
参考网址:http://blog.csdn.net/twj1710/archive/2006/05/09/715479.aspx

 1.源码下载
  svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer
   下载libavcodec和libavutil,方法
  svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
    下载的目录中有两个子目录,libavutil和libavcodec,然后把这两个目录拷到Mplayer目录下(很重要,在libavutil和 libavcodec有mips子目录)

 2.在mplayer主目录下新建一个脚本文件build-mips.sh,主要是写configure设置,内容如下:
#!/bin/sh
./configure --cc=mipsel-linux-gcc \
--host-cc=gcc \
--enable-cross-compile \
--target=mips-mips-linux \
--enable-linux-devfs \
--disable-win32dll \
--disable-dvdread \
--enable-fbdev \
--enable-liba52 \
--disable-libmpeg2 \
--disable-ivtv \
--enable-liba52 \
--disable-mp3lib \
--enable-static
--disable-live 2>&1 | tee logfile

下面部分参考网上的资料.
--cc=arm-linux-gcc设置交叉编译器
 
--host-cc=gcc是用来编译一些需要在host上执行的中间文件的,如 codec-cfg,切记不能少了或搞错了!网上的《mplayer在ARM9(s3c2410)上的移植》(以下简称《移》文)一文介绍说遇到提示 codec-cfg不能被执行出错时的解决方法是先将codec-cfg编译成i386平台的在再这里停下来时用i386的codec-cfg替代从而使 编译继续。通过实验设置了这个参数就不用那么麻烦了,而且整个过程也显得比较幽雅了。
 
--enable-cross-compile ,允许交叉编译,我是看./configure --help中有这个选项,所以就加入了,对编译有没有影响还不是很清楚.
 
--enable-linux-devfs set default devices to devfs ones,configure中是这么解释的,具体的含义还不是很清楚,不过这个跟编译有很大的影响,如果没有加上这个选项,在pxa270平台上不能正 常运行程序,不能显示.
 
--target=mips-mips-linux这个参数要注意的是一个分三部分,第一部分的mips是指arch,这里设定为mips;第二部分的 mips是指具体的版本,这个要注意了,一定要跟libavcodec目录下的平台目录名一致,否则为这个平台的优化代码没办法编译进去;第三部分是系统 平台。这个主要是用在libavcodec的编译中,libavcodec下面支持很多平台,比如i386,armv4l,ppc,sh,...,你进入 libavcodec的目录下就可以看见这些子目录,里面分别存放跟这些平台相关的优化汇编代码,我们所用的平台是mips.
 
--enable-static是设定静态连接,不需要一堆乱七八糟的动态库,尤其对我们这些新手来说省了很多的麻烦。如果设置了这个参数就不用设置— prefix了,另外也不用执行make install。
 
最后的一个2>&1 | tee logfile意思是将执行的情况在输出到屏幕的同时记录到logfile文件中,在控制台下编译比较有用。
 
剩余的几个参数没什么好介绍的了,记住--disable-mencoder,我们没有加上。因为我们需要mencoder来编码。
如果不清楚其它的参数的意思自己看configure文件(./configure --help),里面都有介绍。
 
 3.cp mplayer mencoder /nfsroot/rootfs/usr/bin 测试运行
  #mplaye test.avi


三:mencoder 使用

mencoder进行操作的常用方法: mencoder infile.* -o outfile.* [-ovc 目标视频格式] [-oac 目标音频格式] [-of 目标文件格式]

-ovc就是你要转换成为什么格式的文件 我们可以使用的参数是:xvid,x264,nuv,raw,lav
如果你想使用一些高级的格式像Divx等可以用lavc后面跟另外一些参数选项来控制.当然如果你不想转换格式,而只想调整一下文件的大小,或者嵌入字 幕,我推荐你使用copy参数.

-oac这个参数说明你要使用的音频格式.通常有mp3lame,faac,toolame,twolame,pcm.同样你如果要用AC3/DTS等格 式可以用lavc参数.如不转换就用copy参数.

-of参数说明你的目标文件的容器格式,就是我刚才说道的容器.能够选择的参数有:avi,mpeg,rawvideo,rawaudio 同样也有lavf可以选择.

例子:

1.mencoder -of mpeg -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500 -oac copy media.avi -o output.mpg

把一个"media.avi"的文件转换成为视频文件dest.avi
-lavcopts vcodec=mpeg4:vbitrate=500,指定libavcodec的参数,vcodec=mpeg4指使用mpeg4压缩,就是 DivX,vbitrate=500指500kbps的比特率。

2.mencoder src.avi -o dst.avi -ofps 10 -vf scale=320:240 -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500
    # src.avi 原文件
    # -o dst.avi 定义压缩为dst.avi
    # -vf scale=320:240,调整视频尺寸到320x240;
    # -oac copy,指定音频编码器,copy是指不压缩,直接使用源文件里的音频。copy换成 MP3lame,即压缩成mp3。
    # -ovc lavc,指定视频编码器,使用libavcodec编码器;
    # -lavcopts vcodec=mpeg4:vbitrate=500,指定libavcodec的参数,vcodec=mpeg4指使用mpeg4压缩,就是 DivX,vbitrate=500指500kbps的比特率。
    ## -ofps 23 设定帧数,缩小帧数对节约文件大小效果不明显    

VIDEO:  [XVID]  640x480  12bpp(12位每像素)  25.000 fps  820.5 kbps (100.2 kbyte/s,码率)

3.
mencoder "输入文件" -o "输出文件" -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=100:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050

语法说明:
mencoder "输入文件" -o "输出文件"  
-of lavf    //参数 -of :输出文件的格式,flv文件是属于lavf格式
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames    //lavf格式的参数设置,对于转换flv格式,最好加上这个长句.意思是不用bframes.
-oac mp3lame   //输出音频编码器,这里用的mp3lame
-lameopts abr:br=56   //是专门针对mp3lame的参数设置,abr:br=56,是设置音频比特率为56

//视频编码器的设置:
-ovc lavc //输出视频编码器
-lavcopts
vcodec=flv:   //指定视频编码器为flv
vbitrate=500: //指定视频比特率为500 ,低品质为150kb/s,中等品质为400kb/s,高品质为700kb/s
mbd=2:        //宏模块选择算法,值为0~2默认为0,值越大转换越缓慢,但在品质和文件大小方面有好处
mv0:          //编译每个宏模块并选择最好的一个,当mbd=0时无效;
trell:        //会稍微增加品质,mbd>0时效果更明显;
v4mv:         //量子化网格搜索,对每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会好点.

//mencoder的参数
-vf scale=512:-3   //-vf表示视频格式scale是缩放,512:-3表示强制将宽度设置为512,高度写为-3表示保持高宽比,也可以设置为-1或-2,
-ofps 12            /*输出视频的帧频,一般,用于flash播放的视频帧频高了没有意义,反而会增加视频文件大小,但如果ofps设置的不合适,
                           比如源视频帧频不是ofps的整数倍,可能会导致转换后的视频、音频不同步,
                           似乎可以将这一参数改为-noskip来解决这一问题;*/
-srate 22050      //音频采样率一般为22050或44100.
-af channels=2:2:1:0:1:1 //右声道
-af channels=2:2:0:0:0:1 //左声道
-stereo 0 //立体声
-oac mp3lame : //输出音频使用mp3编码
-lameopts mode=2:cbr:br=32 : //码率br=32 kbit
-ovc xvid -xvidencopts bitrate=200 : //以xvid方式编码,码率200kbps (经实验,目前divx比xvid要快,在使用vhq功能时会稍稍影响速度)
-vf scale=480:-3 -sws 9 : //变换至480像素宽,高度按比例缩放


--------------------参数选择分析------------------------

18fps:这是以前通过多次测试得来的,一般电视剧和动画片15fps就够用了.如果场景变换不是很大,13fps就能保证播放流畅.降低fps值可以 使压缩速度更快,对于电影,特别是动作片,要保证流畅无马赛克,就要提高fps,最大24就够了

选择18fps足以应付大部分,性价比高

阅读(1528) | 评论(0) | 转发(0) |
0

上一篇:Git使技巧篇

下一篇: H.264与MPEG4区别

给主人留下些什么吧!~~