java + ffmped + mencoder搭建视频处理平台

来源:互联网 发布:win10多核优化 测试 编辑:程序博客网 时间:2024/05/01 16:34
java + ffmped + mencoder搭建视频处理平台

  ffmpeg+mencoder几乎可以完成目前基于web的播客平台任何音视频处理的操作.如果还需要添加一些什么的话,那么就是视频在线录制功能了,这个也可以用ffmpeg+fms来完成,因此一般的类似于YouTube的一些可见功能都可以在ffmpeg+mencoder+fms来做后台实现.由于fms没有实践,因此这里不描述.
 本文有三部分:
 1)ffmpeg+mencoder环境搭建
 2)常见操作说明
 3)个人的一些使用心得

1.ffmpeg+mencoder环境搭建

 1)概论
 音视频界众多的编解码协议和各个公司定义的专用格式导致目前的视频音频文件纷繁复杂,单纯的ffmpeg支持的格式并不完全包括所有种类,至少 swf,rmvb(rv4)目前的版本是不支持的.同时wma9似乎可以支持了.但没有测试.同时mencoder能支持rm,rmvb等格式,但是从视频中获取某帧截图的工作只能由ffmpeg完成.因此可以采用ffmpeg+mencoder完成目前所有流行格式的视频压缩转换,设置视频信息,截取视频中的图片等功能了,同时,采用其他的一些开源工具如MediaInfo可以获取视频的元数据信息.

 2)ffmpeg篇
 首先获取软件包:ffmpeg,lame(支持mp3),ogg vorbis,x264(h264 codec),xvid,3gp,libdts,mpeg4 aac.这些软件包在71.21的/home/zhengyu/tools里面都能找到.如果需要网上下载的话,可以提供下载地址.
   ffmpeg官网下载:http://ffmpeg.mplayerhq.hu/ffmpeg-checkout-snapshot.tar.bz2(svn).
   如果官网下载有问题的,xplore也提供了1月30的snapshot:下载ffmpeg.

   lame下载:当前版本为3.97,http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309 或者到xplore下载lame.
   ogg vorbis:这个一般的redhat自带,不需要下载.可以去看看/usr/lib/libvorbis.a在不在,如果不在可以yum install或apt-get install.
   xvid下载:http://downloads.xvid.org/downloads/xvidcore-1.1.0.tar.gz, xplore下载xvid.
   x264下载:这个可以去下寻找最近的snapshot下载,或者svn获取,注意如果ffmpeg是什么时候的,x264的snapshot也应该是什么时候的,不然编译的时候容易报错.ftp://ftp.videolan.org/pub /videolan/x264/snapshots/
   xplore下载x264的1月29日的snapshot.
   libdts:http://download.chinaunix.net/down.php?id=11568&ResourceID=5785&site=1, xplore下载libdts:
 上面的软件包除了ffmpeg之外,在下载完成后解包,编译的参数都是
./configure --prefix=/usr --enable-shared;make;sudo make install   mpeg4 aac/aad2:http://www.audiocoding.com/modules/mydownloads/visit.php?cid=1&lid=25&PHPSESSID=8267ff75b7c18826fe75eb1c15690862,http://www.audiocoding.com/modules/mydownloads/visit.php?cid=1&lid=23&PHPSESSID=8267ff75b7c18826fe75eb1c15690862.  


 faac和faad2在下载解包之后需要自己automake生成编译文件.其中faac的1.25版本需要将内置的configure.in文件最后的AM_OUTPUT中的几个续行去掉,并取消分行.然后按照bootstrap里面的操作进行,无非是aclocal -I .;autoheader;libtoolize --automake;automake -a --copy;autoconfig(或者前面的由autoreconf -vif替代);./configure --prefix=/usr --enable-shared;make;sudo make install;
 faad2的2.5版本需要修改内置的configure.in文件,不然会在没有libbmp时编译会通不过.找到configure.in中下面一段:

引用
if test x$WITHBMP = xyes; then    AC_DEFINE([HAVE_BMP], 1, [User wants beep media player plugin built])    AM_CONDITIONAL([HAVE_XMMS], true)    AM_CONDITIONAL([HAVE_BMP], true)   fi     if test x$WITHDRM = xyes; then    改成   if test x$WITHBMP = xyes; then    AC_DEFINE([HAVE_BMP], 1, [User wants beep media player plugin built])    AM_CONDITIONAL([HAVE_XMMS], true)    AM_CONDITIONAL([HAVE_BMP], true)   else   AC_MSG_NOTICE(no bmp build configured)    AM_CONDITIONAL([HAVE_BMP], false)   fi     if test x$WITHDRM = xyes; then   

 然后
autoreconf -vif;./configure --prefix=/usr --enable-shared;make;sudo make install;  这里提供两个已经修改好的.只需要make clean;make;sudo make install;的tar包.faac1.25下载,faad2.5下载.

   3gp支持:在编译ffmpeg加入--enable-amr_nb --enable-amr_wb的时候,会有提示,下载:http://www.3gpp.org/ftp/Specs/archive /26_series/26.204/26204-510.zip,解压的源代码文件以后把里面的文件都拷贝到ffmpeg的源代码目录下 libavcodec/amrwb_float;然后下载:http://www.3gpp.org/ftp/Specs/archive /26_series/26.104/26104-510.zip,解压得源代码文件以后把里面的文件都拷贝到ffmpeg解包目录下的 libavcodec/amr_float,然后交给ffmpeg编译去做了.
   也可以在这里下载这两个包:amrwb_float下载,amr_float下载.

   这些codec都安装完毕之后便可以编译ffmpeg了,编译参数如下:
./configure --prefix=/usr/local --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-faadbin --enable-dts --enable-pp --enable-faad --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay   make   (sudo make install)  


 然后就可以尝试用ffmpeg做视频转换截图了.

   3)mencoder篇
   首先获取mplayer软件包极其mplayer官网上自带的codecs.如果喜欢mplayer,也可以下载gui和font.关于 mplayer-1.0rc1在71.21的/home/zhengyu/tools中能找到.
如果需要网上下载,可以去官网:http: //www.mplayerhq.hu/design7/dload.html.
下载rc1地址如下:http://www1.mplayerhq.hu /MPlayer/releases/MPlayer-1.0rc1.tar.bz2.
最新的svn版本:http: //www1.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2.
官网同时也给出了一些codec,其中就有rm格式的codec:http://www1.mplayerhq.hu/MPlayer/releases /codecs/essential-20061022.tar.bz2(x86).
xplore也提供下载,mplayer1.0rc1下载,codec下载.

   下载完成之后,将tar vxjf essential-20061022.tar.bz2;sudo mkdir -p /usr/lib/codecs;sudo cp -rf essential-20061022/* /usr/lib/codecs;然后解包mplayer,按如下方式编译:
./configure --prefix=/usr/local --enable-gui --enable-largefiles  --enable-gif --enable-png --enable-jpeg --language=zh_CN --with-codecsdir=/usr/lib/codecs/   make   (sudo make install)  

   然后就可以使用mencoder,当然也有一个没有gui的mplayer可以播放各种视频了.不过我们需要的是mencoder.至此,ffmpeg+mencoder搭建完成.

2.常见操作说明
 对于ffmpeg,可以将除swf,rmvb,wmav9以外的视频/音频格式转换成flv/mp3,同时可以截取这些视频文件中的某个时间的该帧图片.这些实际上就是一个视频播客显示的部分.对于mencoder,支持各种常见格式的视频/音频转换成flv/mp3.或者转换成avi.
 1)ffmpeg篇:
 ffmpeg的命令行参数因为太多,这里不列出,可以用ffpmeg -h可以查看到.列出非高级参数如下:

引用
Main options:   -L                  show license   -h                  show help   -version            show version   -formats            show available formats, codecs, protocols, ...   -f fmt              force format   -i filename         input file name   -y                  overwrite output files   -t duration         set the recording time   -fs limit_size      set the limit file size   -ss time_off        set the start time offset   -itsoffset time_off  set the input ts offset   -title string       set the title   -timestamp time     set the timestamp   -author string      set the author   -copyright string   set the copyright   -comment string     set the comment   -album string       set the album   -v verbose          control amount of logging   -target type        specify target file type ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)   -dframes number     set the number of data frames to record   -scodec codec       force subtitle codec ('copy' to copy stream)   -newsubtitle        add a new subtitle stream to the current output stream   -slang code         set the ISO 639 language code (3 letters) of the current subtitle stream     Video options:   -vframes number     set the number of video frames to record   -r rate             set frame rate (Hz value, fraction or abbreviation)   -s size             set frame size (WxH or abbreviation)   -aspect aspect      set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)   -croptop size       set top crop band size (in pixels)   -cropbottom size    set bottom crop band size (in pixels)   -cropleft size      set left crop band size (in pixels)   -cropright size     set right crop band size (in pixels)   -padtop size        set top pad band size (in pixels)   -padbottom size     set bottom pad band size (in pixels)   -padleft size       set left pad band size (in pixels)   -padright size      set right pad band size (in pixels)   -padcolor color     set color of pad bands (Hex 000000 thru FFFFFF)   -vn                 disable video   -vcodec codec       force video codec ('copy' to copy stream)   -sameq              use same video quality as source (implies VBR)   -pass n             select the pass number (1 or 2)   -passlogfile file   select two pass log file name   -newvideo           add a new video stream to the current output stream     Subtitle options:   -scodec codec       force subtitle codec ('copy' to copy stream)   -newsubtitle        add a new subtitle stream to the current output stream   -slang code         set the ISO 639 language code (3 letters) of the current subtitle stream     Audio/Video grab options:   -vd device          set video grab device   -vc channel         set video grab channel (DV1394 only)   -tvstd standard     set television standard (NTSC, PAL (SECAM))   -ad device          set audio device   -grab format        request grabbing using   -gd device          set grab device     Advanced options:   -map file:stream[:syncfile:syncstream]  set input stream mapping   -map_meta_data outfile:infile  set meta data information of outfile from infile   -benchmark          add timings for benchmarking   -dump               dump each input packet   -hex                when dumping packets, also dump the payload   -re                 read input at native frame rate   -loop_input         loop (current only works with images)   -loop_output        number of times to loop output in formats that support looping (0 loops forever)   -threads count      thread count   -vsync              video sync method   -async              audio sync method   -vglobal            video global header storage type   -copyts             copy timestamps   -shortest           finish encoding within shortest input   -dts_delta_threshold   timestamp discontinuity delta threshold   -ps size            set packet size in bits   -muxdelay seconds   set the maximum demux-decode delay   -muxpreload seconds  set the initial demux-decode delay     


     如果这些都明白了,并且有编程基础,你就可以去参与ffmpeg开发了.其实这些堆积起来的命令95%一般是用不上的.这里介绍一些简单的常见的命令:
-fromats 显示可用的格式
-f fmt 强迫采用格式fmt
-I filename 输入文件
-y 覆盖输出文件
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持(截图需要)
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
-title string 设置标题
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-target type 设置目标文件类型(vcd,svcd,dvd),所有的格式选项(比特率,编解码以及缓冲区大小)自动设置,只需要输入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高质量设置

-b bitrate 设置比特率,缺省200kb/s
-r fps 设置帧频,缺省25
-s size 设置帧大小,格式为WXH,缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop/botton/left/right size 设置顶部切除带大小,像素单位
-padtop/botton/left/right size 设置顶部补齐的大小,像素单位
-padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:蓝排列,比如 000000代表黑色)
-vn 不做视频记录
-bt tolerance 设置视频码率容忍度kbit/s
-maxrate bitrate设置最大视频码率容忍度
-minrate bitreate 设置最小视频码率容忍度
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用codec编解码方式. 如果用copy表示原始编解码数据必须被拷贝.(很重要)

-ab bitrate 设置音频码率
-ar freq 设置音频采样率
-ac channels 设置通道,缺省为1
-an 不使能音频纪录
-acodec codec 使用codec编解码

-vd device 设置视频捕获设备,比如/dev/video0
-vc channel 设置视频捕获通道 DV1394专用
-tvstd standard 设置电视标准 NTSC PAL(SECAM)
-dv1394 设置DV1394捕获
-av device 设置音频设备 比如/dev/dsp

-map file:stream 设置输入流映射
-debug 打印特定调试信息
-benchmark 为基准测试加入时间
-hex 倾倒每一个输入包
-bitexact 仅使用位精确算法 用于编解码测试
-ps size 设置包大小,以bits为单位
-re 以本地帧频读数据,主要用于模拟捕获设备
-loop 循环输入流。只工作于图像流,用于ffserver测试

     ffmpeg进行操作的常用方法:

   1.转换成flv文件:ffmpeg -i infile.* -y (-ss second_offset -ar ar -ab ab -r vr -b vb -s vsize) outfile.flv
              其中second_offset是从开始的多好秒钟.可以支持**:**:**格式,至于ar,ab是音频的参数,可以指定 ar=22050,24000,44100(PAL制式),48000(NTSC制式),后两种常见,ab=56(视音频协议的codec而定,如果要听高品质,则80以上).vr,vb,vsize是视频参数,可以指定 vr=15,25(PAL),29(NTSC),vb=200,500,800,1500(视视频协议的codec而定,可以通过查看专业的codec说明文档获取,如果你手头有一份详细的各种codec的文档,请提供一份给我,不胜感激.)
              还有一些参数-acodec ac -vcodec vc(ac指定音频codec,ar和ab可以省去,vc指定视频codec,vr和vb可以省去,自动采用相应的codec参数)
              还有很多高级参数,如-qmin,-qcale等,请查看详细文档.
              还有-an和-vn参数,分别从多媒体文件中提取出纯粹视频和音频.
              另,如果你是用shell批量处理,请使用-y参数覆盖生成flv.

   2.截取图片:ffmpeg -i infile.* -y (-ss second_offset) -t 0.001 -s msize (-f image_fmt) outfile.jpg
            其中second_offset同上,msize同vsize,图片大小.image_fmt=image2强制使用jpg,image_fmt=gif,强制使用gif格式.
            还可以用-vframes fn指定截取某帧图片,fn=1,2,3,...

 
 2)mencoder篇:
 mencoder的作用主要在视频转码方面.在安装完mplayer后,mencoder也编译生成了.可以man mencoder获取mencoder的说明文档.
 mencoder的参数更加复杂,不过也无非是音频处理视频处理两个方面,可以参看网络例子:http://www.masoncn.com/post/144.html.这里不作详细的列举了.

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

   1.转换成flv文件: mencoder infile.* -o outfile.flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
                                mencoder infile.rmvb -o outfile.flv -vf scale=-3:150 -ofps 12 -oac mp3lame -ovc xvid -xvidencopts bitrate=112

   2.转换成avi文件: mencoder infile.* -o outfile.avi -of avi -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600

   3.转换成wmv文件(复杂写法,其中高级参数可以省去): mencoder infile.* -o outfile.wmv -of lavf -ofps 25 -oac mp3lame -lameopts cbr:preset=128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -srate 22050 -sws 9 -subcp cp936 -subpos 0 -subalign 0 -subfont-text-scale 3 -lavfopts i_certify_that_my_video_strea

   4.截图:  mplayer infile -ss START_TIME -noframedrop -nosound -vo jpeg -frames N

   其中-ovc,-oac和-of是必须的,-ovc是指定视频codec,指定了ovc之后通常带一个该codec的opt参数,-oac是指定音频 codec,也会在其后带一个codec的opt参数.可以指定细节以决定视频音频质量和转换速率.具体的细节可以参看专业的技术文档.

3.个人的一些心得
 在视频播客网站上,对于音视频本身一般存在如下几个问题:
   1)有些格式的音视频文件不支持.不能做到全的问题.
   2)上传的同样内容,但不同格式音视频排重的问题.从存储和应用两个方面描述这个问题会有不同层次的解决方案.
   3)对于某些格式的音视频文件,既有可能是纯粹音频的,也可以是纯粹视频的.如rm格式.怎样区分这种文件以方便应用的问题.
   4)音视频检索,视频描述能不能做到内容方式而不是用户定义关键字的方式.
   5)音视频相似度的利用和处理.
   6)音视频文件的下载获取.

   对于第一个问题采用ffmpeg+mencoder可以获取一个让人可以接受的解决办法.第三个问题可以在上传之后安装一个前端过滤程序,区分音频文件和视频文件,已经有相应的开源工具和代码做这些事情.对于第二个问题,首先是统一格式,然后计算音视频文件的hash,在存储部分采用分布式CAS技术存储,应用方面构架在CAS之上.而第四个问题,第五个问题有待深入研究.第六个问题可以考虑p2p的方式,不过这个不是太重要.
    对于采用shell在ffmpeg+mencoder+MediaInfo环境下处理视频队列和截取视频文件,可以参看这篇文章.

博文来源:http://huqilong.blog.51cto.com/53638/136985

 

原文引自:http://ajava.org/course/other/12718.html




ubuntu中安装ffmpeg+mencoder转换flv

ffmpeg篇   

  由于项目中需要实现将上传视频格式转为flv,这几天一直在研究ubuntu下ffmpeg与mencoder,没想到在centos下安装ffmpeg成功,在ubuntu下搞了好久呵呵。

  实验所用的系统是ubuntu 7.10

  首先安装所需要的库:

  apt-get install liba52-dev libdts-dev libgsm1-dev libvorbis-dev libxvidcore4 libxvidcore-dev libdc1394-dev libfaac-dev liblame-devlibfaad2-dev libtheora-dev libsdl1.2-dev 

  libx264-dev也可以apt但是我这里下安装下来,会报关于libavcodec/libx264.c这个文件的错误。我是编译安装的。下载地址ftp://ftp.videolan.org/pub/videolan/x264/snapshots/

  然后让ffmpeg支持 3GP格式

  下载源代码

  wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-510.zip

  解压以后把里面的26204-510_ANSI-C_source_code.zip解压后的文件都拷贝到ffmpeg/libavcodec/amrwb_float

  wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-510.zip

  解压以后把里面的26104-510_ANSI_C_source_code.zip解压后的文件都拷贝到ffmpeg/libavcodec/amr_float

  而后下载amr-wb包,解压,编译,安装:

  wget http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.1.tar.bz2

  tar jxvf amrwb-7.0.0.1.tar.bz2

  cd amrwb-7.0.0.1

  ./configure --prefix=/usr/local

  make

  make install

  下载amr-nb包,解压,编译,安装:

  wget http://ftp.penguin.cz/pub/users/utx/amr/amrnb-6.1.0.4.tar.bz2

  tar jxvf amrnb-6.1.0.4.tar.bz2

  cd amrnb-6.1.0.4

  ./configure --prefix=/usr/local

  make

  make install

  最后checkout ffmpeg的最后版本:

  svn co svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

  cd ffmpeg 

  然后编译

  ./configure --prefix=/usr --disable-debug --enable-shared --enable-gpl --enable-postproc --enable-swscale --enable-pthreads --enable-x11grab --enable-liba52 --enable-liba52bin --enable-libdc1394 --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-libgsm --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libamr_nb --enable-libamr_wb --enable-nonfree

  make

  make install

  坐下来喝杯茶吧,make的时候很慢的呵呵。编译成功后。可以通过命令尝试一下将视频转换成flv也可以转换成3GP 哈,转换3GP的命令网上很少,我找到一条可以用的。

  ffmpeg -y -i 2.flv -ac 1 -acodec libamr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp

  好,我要得是转换flv命令如下

  ffmpeg -i "a.avi" -y -ab 32 -ar 22050 -b 800000 -s 640*480 /opt/a.flv

  mencoder安装篇

  1、下载主程序: MPlayer-1.0rc1.tar.bz2

  2、下载essential-20061022.tar.bz2,安装:

  tar vjxf essential-20061022.tar.bz2

  mv essential-20061022 /usr/lib/codes

  chmod 644 /usr/lib/codes/*

  chown root.root /usr/lib/codes/*

  3、下载windows-essential-20061022.zip,安装:

  unzip windows-essential-20061022.zip

  mv windows-essential-20061022 /usr/lib/wincodes

  chmod 644 /usr/lib/wincodes/*

  chown root.root /usr/lib/wincodes/*

  4、安装mplayer

  tar vjxf MPlayer-1.0rc1.tar.bz2

  cd MPlayer-1.0rc1

  ./configure --prefix=/usr/local/mplayer/ --enable-freetype --with-codecsdir=/usr/lib/codes/ --with-win32libdir=/usr/lib/wincodes/ --disable-gcc-check --language=zh_CN

  make

  make install

  命令行转换

  mencoder -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -ovc lavc -lavcopts vcodec=flv:vbitrate=500 -srate 22050 -oac lavc -lavcopts acodec=mp3:abitrate=56 -ffourcc FLV1 -oac mp3lame 1.rmvb -o 1.flv

  如果你需要使用mplayer在linux下播放视频,还需要加上--enable-gui(图形界面),不过这样就要安装多很多东西了,这里我们只使用它的mencoder,所以--enable-gui可以省略

  这样几乎所有格式都支持了,呵呵!

  本文出自 “linuxer” 博客,请务必保留此出处http://deidara.blog.51cto.com/400447/88965



Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结

2011年04月26日 下午 7:59 | 作者:littlebat

http://www.learndiary.com/2011/03/ffmpeg-%E6%89%8B%E6%9C%BA%E8%A7%86%E9%A2%91%E8%BD%AC%E6%8D%A2%E5%AD%A6%E4%B9%A0/

近段时间在学习 Ffmpeg、Mencoder 音视频转换,大概在 Ubuntu 10.04、Ubuntu 10.10、Ubuntu Natty 测试版上安装和使用过。重点是针对低分辨率的普通手机视频,测试的手机为 Bird V780,主要参数为,视频编码:mpeg4、h263,音频编码:faac、amrnb,容器格式:mp4、3gp,分辨率:176×144;音乐文件格式:mp3 。下面对 Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用作个小结。

1、安装:
安装 Ubuntu 软件仓库里的版本是很容易的,用 sudo apt-get install 命令就可以自动安装上。但是官方仓库里面的版本比较陈旧,可能缺失一些功能和存在一些 bug 没有解决,更重要的是,一些需要的编码支持没有被官方版本编译进去,如用于普通手机视频的 faac、amr 音频编码支持等。而且,两个软件官方网站均推荐使用其 svn 或 git 开发版本。所以,下面着重总结编译安装 ffmpeg 和 mencoder。

为了避免可能的冲突,在开始之前,我卸载了仓库版本的相关软件:sudo apt-get remove ffmpeg mencoder mplayer

获取 Ffmpeg 开发版本:git clone git://git.videolan.org/ffmpeg.git ffmpeg
获取 Mplayer 开发版本(包含了 mencoder):svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer

实际上 ./configure 配置 Mplayer 时会自动从 Ffmpeg 的开发库中下载 ffmpeg 最新开发版源码供编译 Mplayer 使用,因为 Mplayer 和 Mencoder 会调用 Ffmpeg 的库。而且,在当前的 Mplayer 编译中,如果没有特别设定,Mplayer 会把 Ffmpeg 的库编译成静态库编入 Mplayer 或 Mencoder 的二进制文件中,使这两个文件达到约14M左右。但是,我为了保险起见,编译 Ffmpeg 时就使用单独下载的源码。

通过事先的了解或在二者源码树下面执行 ./configure –help 得到配置帮助,得到编译额外编码支持库的信息,如:libfaac, libopencore_amrnb 等。你可以据此计划需要安装哪些额外编码库。

然后是根据你的需要安装额外编码库。在 Ubuntu 下,可以用 apt-get 安装那些库:如:

sudoapt-getinstall libx264-dev libxvidcore-dev libopencore-amrwb-dev \libopencore-amrnb-dev libfaad-dev libfaac-dev libmp3lame-dev \libtwolame-dev liba52-0.7.4-dev libcddb2-dev libcdaudio-dev \libcdio-cdda-dev libvorbis-dev libopenjpeg-dev

但是,在 configure ffmpeg 时,会报告:libx264 version must be >= 0.99
显然是 Ubuntu 中的 libx264 版本低了,那么 git clone git://git.videolan.org/x264.git 得到 x264 的源码再编译安装就行了。

当然,如果 Ubuntu 仓库中的版本不能满足你的需要,你可以选择从源码安装。更多的从源码安装编解码库的信息可以参考 Mplayer 相关文档。

另外,编译 ffplay 需要 libsdl1.2-dev 库:sudo apt-get install libsdl1.2-dev

下面进行 Ffmpeg 的编译安装。经过试验,也许是由于 Ubuntu 中的一个 bug,当存在仓库版本中的 libavutil、libavcodec、libavformat 等库时,编译安装的 ffmpeg 执行失败(比如报错:ffmpeg: relocation error: /opt/ffmpeg20110404/lib/libavfilter.so.1: symbol av_expr_free, version LIBAVUTIL_50 not defined in file libavutil.so.50 with link time reference),普通的 apt-get remove 不行,要连配置文件一起去掉,用 apt-get purge才行 (我在 Ubuntu 10.10 中发现,apt-get remove 后,仍存在 /usr/lib/i686/cmov/ 目录下面的相关文件)。如我使用了下面的命令彻底卸载了我认为有关的一些库:

sudoapt-get purge libavutil-dev libavutil50 libavutil-extra-50 \libavcodec-dev libavcodec52 libavcodec-extra-52 libavformat-dev \libavformat52 libavformat-extra-52 libavdevice-dev libavdevice52 \libavdevice-extra-52 libavfilter-dev libavfilter1 libavfilter-extra-1 \libswscale-dev libswscale0 libswscale-extra-0 libpostproc-dev \libpostproc51 libpostproc-extra-51 gnome-desktop-environment

最后那个 gnome-desktop-environment 如果不卸载掉,是无法同时卸载如:libavutil50 和 libavutil-extra-50 的,也无法清除掉 /usr/lib/i686/cmov 下面的内容,从而导致 ffmpeg 在 Ubuntu 中执行报错。
我看卸载了 gnome-desktop-environment 只是会卸载如:totem、gnash、sound-juicer 等并不是核心的组件,不会影响平常的使用。如果确实需要保留这些东西,我觉得可以试试把原来 ffmpeg 和 mplayer 的仓库版本文件强制删除,但在软件包管理系统中应该并没有被卸载的记录,再把 ffmpeg 和 mplayer 等安装在 /usr 标准目录下,用以替代原来的相应文件。不过,我没有试过。
下面配置 ffmpeg :

./configure --enable-nonfree--enable-gpl--enable-version3 \--enable-shared--enable-postproc--enable-libmp3lame \--enable-libopenjpeg--enable-libvorbis--enable-libopencore-amrnb \--enable-libopencore-amrwb--enable-libxvid--enable-libx264  \--enable-libfaac--enable-pthreads--prefix=/opt/ffmpeg20110404

然后,按照常规的 make, sudo make install 就完成了,双核电脑可以用 make -j 2 节省编译时间。

因为我将 ffmpeg 安装在了非标准目录,所以添加了库文件搜索设置(使用 root 权限):echo "/opt/ffmpeg20110404/lib" > /etc/ld.so.conf.d/ffmpeg.conf && ldconfig -v

下面配置 mplayer (mencoder):

在编译安装 mplayer 之前,在 Ubuntu 下要安装 libasound2-dev ,否则会因为缺少 alsa 的声音驱动而导致播放没有声音。

经过试验,mplayer 的配置比较自动化,configure 程序会搜索相关编码库文件,如果存在则会自动启用,而不用像 ffmpeg 那样必须像“–enable-libmp3lame”那样明确指定。不过,默认配置选项编译的 mplayer 是静态链接到它自带的 ffmpeg 源码中编译的静态链接库,这导致了 mplayer 或 mencoder 的二进制文件达到了 14M 左右。这可以通过禁用 ffmpeg 静态链接编译(–disable-ffmpeg_a)和告知 ffmpeg 的头文件和库文件位置( –extra-cflags=”-I/opt/ffmpeg20110404/include” –extra-ldflags=”-L/opt/ffmpeg20110404/lib”)来达到动态链接到已经安装完成的 ffmpeg 库文件的目的。同样,我把 mencoder 安装在了非标准目录,下面是我用的配置命令:

./configure --prefix=/opt/mplayer20110404 --disable-ffmpeg_a \--extra-cflags="-I/opt/ffmpeg20110404/include"--extra-ldflags="-L/opt/ffmpeg20110404/lib"

从 ./configure –help 中,与动态链接到 ffmpeg 库可能相关的参数有:–enable-rpath –disable-ffmpeg_a –enable-dynamic-plugins,但我只用了 –disable-ffmpeg_a 就完成了动态链接到 已经安装了的 ffmpeg 库的目的,也没有详细研究其它的参数了。

安装 ffmpeg 的 man 文档需要:sudo make install-man

与 ffmpeg 类似,编译安装完成后使用 root 权限执行:echo "/opt/mplayer20110404/lib" > /etc/ld.so.conf.d/mplayer20110404.conf && ldconfig -v

另外,如果不需要 ffmpeg 和 mplayer 中的一些组件(如: ffplay, mplayer),可以在 configure 中设定。具体查看: ./configure –help

然后,把 ffmpeg 和 mencoder 的可执行文件路径加入 PATH 环境变量,使用 root 权限执行:

echo"export PATH=\"/opt/ffmpeg20110404/bin:/opt/mplayer20110404/bin:\$PATH\"">>/etc/profile

2、使用
主要以转换成普通手机(以 Bird V780 为测试手机)可以播放的 176×144 分辨率的 3gp 或 mp4 文件为例,小结一下 ffmpeg 和 mencoder 的使用。

总的来说,ffmpeg 转换视频比 mencoder 更傻瓜化,只要指定了必要的参数,它就能产生能在手机上播放的 3gp 文件,如下:

ffmpeg-i test10s.avi -ar8000-ac1-ab 10.2k -s 176x144 -aspect11:9 \-b 200k -r15 outaspect.3gp #生成 h263+libopencore_amrnb 的 3gp 视频

ffmpeg-i test10s.avi -b 200k -r15-s 176x144 -aspect11:9-acodec libfaac \-ac2-ar44100-ab 128k outfaac.3gp #生成 h263+libfaac 的 3gp 视频

但是用 Mencoder 转换,我使用的可工作的命令行为:

mencoder yyzs.rmvb -ss160:0-endpos1:0-of lavf -lavfoptsformat=mp4 -srate44100 \-vf-addcrop=440:360,scale=176:144,harddup -ofps15-oac faac -faacopts \br=128:mpeg=4:object=2:raw -ovc lavc -lavcoptsvcodec=mpeg4:aglobal=1:vglobal=1 \-o yyzs17tt10.mp4

在 Bird V780上测试,其中缺了:br=128:mpeg=4:object=2:raw aglobal=1:vglobal=1 都不能播放,缺了br=128:mpeg=4会变成6声道从而不能播放。但在 Bird V780 手机上不能播放并不能说明在其它手机或电脑上不能播放。因为可能是 mencoder 的 bug,到目前为止,libopencore_amrnb 音频编码的 3gp 视频不能正常转换,后面会详述。

Mencoder 的局限及解决方案
上面说过,因为可能是 mencoder 的 bug,到目前为止,libopencore_amrnb 音频编码的 3gp 视频不能正常转换。因为在我的测试中,转换成的 3gp 视频的音频长度比实际长度短了五分之四,下面的例子是 10 秒的音频被强制压缩成了 2 秒:

/usr/local/bin/mencoder -noconfig all -oac lavc -ovc lavc -lavcopts \vcodec=h263:vbitrate=200:acodec=libopencore_amrnb:abitrate=10200 \-of lavf -ofps15-srate8000-vfscale=176:144 \-aflavcresample=8000,channels=1,volnorm \-o test10s.r33081.h263.openamrnb.3gp test10s.avi

就算是把 mplayer 的版本换成原来的 1.0rc3,把 amr 的编码器换成旧的 libamr_nb 也是同样的效果。详见:MENCODER: Sound problems trying to convert from anything to 3gp w/amrnb: http://bugzilla.mplayerhq.hu/show_bug.cgi?id=1603 。
解决方案暂时用 ffmpeg 来转换需要编码成 libopencore_amrnb 音频编码的视频。上面有一个相应的 ffmpeg 使用示例。

另外,Mencoder 不能直接把视频转换成只包含音频的音频文件,只能是视频转换到视频。解决方案有两个:
1)、使用 ffmpeg 转换,如下:

ffmpeg-i test.rmvb -vol1000 test.mp3

上面那个 -vol 是为增加音量加的,不加这个参数默认的音量好像是 256。这个参数比较有用,在 mencoder 转换中好像控制音量只有一个 volnorm 声音滤镜参数(-af)用于在不失真的前提下最大化音量,而不能像 ffmpeg 这样有量化的增加音量(但增加过大声音可能会失真)。
2)、使用 mplayer 提取出 pcm 格式的音频,再选择其它工具转换成纯音频文件,如下面是转换成 mp3 的 shell 文件(其中使用了命名管道作为格式转换的中间传递,可以避免中间文件占用磁盘空间及加快处理过程):

#!/bin/bash# usage: tomp3.sh yyzs.rmvb 02:00:00 00:10:00 yyzs2h.mp3 tempfile=`mktemp`rm$tempfilemkfifo$tempfile/usr/bin/mplayer-ss$2-endpos$3-vc null -vo null -ao \pcm:fast:waveheader:file=$tempfile$1&lame$tempfile$4rm$tempfile

后台执行 mplayer 必须在脚本文件中执行,在终端中执行会出错如下:
问题:为什么从命令行终端直接执行如:” /usr/bin/mplayer -vc null -vo null yyzs.rmvb & “会报错:

mplayer: could not connect to socketmplayer: No such file or directoryFailed to open LIRC support. You will not be able to use your remote control.?

也许你要问,既然 mencoder 转换视频音频这么多局限,为什么不使用其它工具,如 ffmpeg 直接进行转换呢?答案就是与 mplayer 被称为 Linux 世界的万能播放器有关,通过支持闭源的 dll 等第三方解码库,mplayer 几乎可以播放世面上的所有音频视频格式文件,包括那些封闭的特殊格式。mencoder 和 mplayer 同用一个解码库,理论上(还没有碰到实践中的意外)只要 mplayer 能够播放,mencoder 就能进行解码从而进行格式转换。尽管网上有说法说 mencoder 的代码很滥,但是它却是 Linux 世界的其它转换工具无法替代的,包括 ffmpeg。

Ffmpeg 的局限
尽管 ffmpeg 转换音频、视频比较方便,而且据说速度还非常快,但其中有一个非常显著的局限,而且这个局限是设计理念造成的。就是 ffmpeg 不支持第三方封装的编解码器,致力于提供原生的编解码器,详见 ffmpeg 文档的 FAQ: http://www.ffmpeg.org/faq.html#SEC5 :

1.4 FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it? No. Windows DLLs are not portable, bloated and often slow. Moreover FFmpeg strives to support all codecs natively. A DLL loader is not conducive to that goal.

比如下面的 2 个文件,用 ffmpeg 就不能正常转换格式:
FullMetal[wmv+AAC]_remux-006.mkv ffplay播放、ffmpeg编码图像花
niceday.wmv 主要约有两处ffplay播放、ffmpeg编码图像花

而用 mencoder 进行转码,用 mplayer 播放上面 2 个源文件效果无误。但需要把额外的解码器 wmvdomd.dll 放入 codecs 解码器目录,否则出现与 ffplay 播放相同的问题。

取长补短,综合运用 mencoder 和 ffmpeg 进行音频视频转换
使用命令行工具有一个好处就是可以用脚本把不同的命令行工具结合起来完成某一个任务。下面针对几种情况小结一下。
1)、音频转换
从试验的结果,单纯的音频转换完全使用 ffmpeg 即可,因为即使是视频文件中的视频部分有问题,音频部分却是可以被 ffmpeg 正常解码从而转换成纯音频文件(我的试验中还没有碰到不能转换的)。
示例命令: ffmpeg -i niceday.wmv niceday.mp3

2)、转换成 mencoder 支持的编码格式(如:不需要转换成 libopencore_amrnb 音频编码的视频格式)
鉴于 mencoder 解码格式的全面性,直接用 mencoder 转换。

3)、转换成 mencoder 不支持但是 ffmpeg 支持的编码格式(如:libopencore_amrnb 音频编码的视频格式)
可以直接用 ffmpeg 转换;如果 ffmpeg 不能正常解码,可以先用 mencoder 转换成中间格式,再用 ffmpeg 由中间格式转换成最终格式,示例如下:

#!/bin/bash# usage: convert3gp.sh yyzs.rmvb yyzs10.3gp 02:00:00 00:10:00 # usage: convert3gp.sh 原视频 目的视频 开始时间点 持续时间 echo"`date`: convert3gp.sh $1 $2 $3 $4 begin.">> timerec.log tempfile=`mktemp`rm$tempfiletempfile=$tempfile.mkvmkfifo$tempfile mencoder -ss$3-endpos$4-noconfig all -oac pcm -ovc lavc -lavcopts \vcodec=h263:vbitrate=200-of lavf -lavfoptsformat=mkv -ofps15 \-vfscale=176:144-o$tempfile$1&#经试验,avi 的中间格式和未指定容器格式的默认情况,好像有时会出错,#像这样使用 mkv 中间格式的情况还没出现过异常。 #mencoder -ss $3 -endpos $4 -noconfig all -oac pcm -ovc raw \#-vf format=yuy2 -o $tempfile $1 & #中间格式可以使用 raw video,但是转换时间要长一些。#部分RV40 的视频导出raw video 用默认的格式为黑白颜色,#要把格式指定为其它的格式如 -vf format=yuy2 才行 ffmpeg-y-i$tempfile-vcodec h263 -b 200k -r15-s 176x144 \-aspect11:9-acodec libopencore_amrnb -ac1-ar8000-ab 10.2k -f 3gp $2#虽然在中间格式中已经转换成了 h263 的视频部分,但如果不重新指定相关参数,#转换成的视频文件会出现“[h263 @ 0x14f81c0]warning: first frame is no #keyframe”的问题,从而导致在定位视频时出现花屏的现象。 #ffmpeg -y -i $tempfile -vcodec h263 -b 200k -r 15 -s 176x144 \#-aspect 11:9 -acodec libfaac -ac 2 -ar 44100 -ab 128k -f 3gp $2 rm$tempfile echo`date`>> timerec.logexit0

转换速度及质量问题
在相同的环境下作了一个测试,转换一个 rmvb 文件6分钟的视频,目的视频是可以在 Bird V780 上播放的 176×144 3gp 文件,视频编码采用 h263,音频编码采用 faac。脚本及测试记录见附件:速度测试,下面是结果比较:

名称             比特率   转换时间   区别ffmpegonly.3gp  336Kbps  3'22"    只用 ffmpeg 转换,加 -async 1 参数;menonly.3gp     321Kbps  2'52"    只用 mencoder 转换,harddup 视频滤镜,-oac faac 音频编码;menonly2.3gp    321Kbps  2'40"    只用 mencoder 转换,harddup 视频滤镜,-oac lavc -ovc lavc -lavcopts acodec=libfaac 音频编码;intermkv.3gp    336Kbps  2'47"    mencoder 和 ffmpeg 结合转换,mencoder 无 harddup 视频滤镜,使用结果视频参数,ffmpeg 指定视频详细参数 -vcodec h263 -b 200k -r 15 -s 176x144 -aspect 11:9;intermkv2.3gp   336Kbps  2'47"    mencoder 和 ffmpeg 结合转换,mencoder 加 harddup 视频滤镜,使用结果视频参数,ffmpeg 指定视频详细参数 -vcodec h263 -b 200k -r 15 -s 176x144 -aspect 11:9;intermkv3.3gp   322Kbps  2'37"    mencoder 和 ffmpeg 结合转换,mencoder 加 harddup 视频滤镜,使用结果视频参数,ffmpeg 未指定视频详细参数 -vcodec copy,缺失关键帧错误导致定位时花屏;interraw.3gp    336Kbps  3'56"    mencoder 和 ffmpeg 结合转换,mencoder 无 harddup 视频滤镜,使用 raw 视频,ffmpeg 指定视频详细参数 -vcodec h263 -b 200k -r 15 -s 176x144 -aspect 11:9;interraw2.3gp   336Kbps  4'03"    mencoder 和 ffmpeg 结合转换,mencoder 加 harddup 视频滤镜,使用 raw 视频,ffmpeg 指定视频详细参数 -vcodec h263 -b 200k -r 15 -s 176x144 -aspect 11:9

从测试结果可知:
1)、只用 mencoder 转换时,采用 lavc 中 faac (libfaac) 的音频编码 menonly2.sh 比直接采用 faac 音频编码 menonly.sh 快 12 秒;
2)、采用 ffmpeg、mencoder 两步转换的 intermkv2.sh 比只采用 mencoder 的 menonly2.sh 慢 7 秒;
3)、只采用 ffmpeg 转换 ffmpegonly.sh 比只采用 mencoder 的 menonly2.sh 慢 42 秒,比采用 ffmpeg、mencoder 两步转换的 intermkv2.sh 慢 35 秒;
4)、转换中,mencoder 加与未加 harddup 视频滤镜转换时间几乎无差别;
5)、采用 ffmpeg、mencoder 两步转换时,采用 raw 视频中间格式的 interraw2.sh 比采用结果视频中间视频格式的 intermkv2.sh 慢 76 秒;
6)、采用 ffmpeg、mencoder 两步转换时,当采用结果视频中间视频格式,ffmpeg 重新指定视频编码详细参数的 intermkv2.sh 比直接使用 -vcodec copy 的 intermkv3.sh 慢 10 秒,但是直接使用 -vcodec copy 会出现缺失关键帧错误导致定位时花屏。

因为转换视频是用于普通手机播放的低分辨率视频,从转换结果和比特率和直观观看来说看不出明显的质量差别。

初步来看,如果遇到 ffmpeg 无法识别原始文件格式但能编码成目的格式,而 mencoder 无法编码成目的格式但能识别原始文件格式时,使用二者结合转换手机低分辨率视频是可行的。在我进行 rmvb 到 3gp 的转换测试中,这种结合转换比纯粹使用 mencoder 约慢,但还比纯粹使用 ffmpeg 转换时快不少。估计是 ffmpeg 解码 rmvb 文件时的效率没有 mencoder 高的缘故吧。

其它问题

1)、在转换宽银幕电影到手机视频的过程中,为了使画面的主要内容更加清晰,可以先截去两边超宽的部分再进行转换,在 mencoder 中可以使用 crop 视频滤镜处理,例如原始为 640×360 的 16:9 ,要转换成 176×144 的 11:9,可以使用视频滤镜 -vf-add crop=440:360,scale=176:144 达到效果;

2)、在 ffmpeg 中,如果只截取中间一段转换进行转换,将 “-i 原始文件名“ 放在 “-ss 开始时间 -t 持续时间“ 的后面并且加上 “-async 1(避免音画不同步)” 可以避免搜索不需要转换的部分而浪费的大量时间。例如,在我的测试中,E7400 双核电脑上,如果转换一部2个半小时电影中2小时以后的10分钟内容,真正转换的时间只用大约1分钟,而如果把 “-i 原始文件名“ 放在 “-ss 开始时间 -t 持续时间“ 的前面,则要增加大约10分钟的定位搜索时间!详见:question about “Buffering several frames is not supported. Please consume all available frames before adding a new one.”

3)、因为多次的测试,上面的命令不一定是同一次的安装,例如有时安装在 /usr/local 下面,有时是安装在 /opt/ 下面等;而且,版本也不一定是同一版本,但命令应该是至少可以在最近的版本中通用的(2011年4月左右)。

结论:
像这种非经济驱动的开源工具,也许不一定像一些闭源的商业工具自成体系的较为完整的功能,但可以通过脚本把各种各有所长的开源命令行工具结合在一起








ffmpeg和Mencoder使用实例小全

上一篇 / 下一篇  2007-12-25 09:00:58
查看( 346 ) / 评论( 0 ) / 评分( 0 / 0 )
 

下载电影的时候,我们总希望在全部下载完成之前能够预览一下影片内容,于是发布者时常会放一些影片截图在种子文件中,或者直接贴到网上,也有一些截图是一张图片,但包含很多幅影片在一起,就像下面这张:
imagemagick-montage-sample

有很多软件能够截取影片图像、合并图像,但如果影片太多,比如视频网站为用户上传的图像生成预览图之类的,人工在gui方式下操作就不可取了,我们需要在命令行方式下来截取、合并。

首先,截取影片图像使用最多的就是mplayer或者ffmpeg,我用mplayer比较熟,本文就以此为例了,ffmpeg功能也是非常强大的,但据说支持的文件格式却不丰富。mplayer截取影片图像的基本命令为:

mplayer -ss START_TIME -noframedrop -nosound -vo jpeg -frames N NAME_OF_VIDEO_FILE   
上例中,-ss指定开始的时间,结合-frames参数,限定从某个时间开始、截取几帧图像。为了体现整个影片的内容,我需要在影片中间隔时间相同 的几个点、每个点截取1帧图像,所以按道理应该用-frames 1,但是mplayer这样截图的情况下,第一帧似乎永远都会截取到一个黑屏,所以我常用-frames 2。截取下来的图像保存在了当前目录,名称从00000001.jpg开始依次递增,按照-frames 2,就是取00000002.jpg为结果,删除00000001.jpg即可。经过简单实验,在截取wmv、rmvb影片时,前面的好几帧都会是黑屏, 也只能参考上面的做法多取几帧了。

为了取影片中间隔大致相同的几个点,可以用-ss指定时间,也可以用-sb指定开始字节,在我的实际使用中,使用-sb只会得到黑屏,所以通过文件 大小来设置间隔点的办法不行,只能用-ss时间间隔了,这就需要首先得到影片的总时间。好在mplayer为我们提供了类似的功能:

mplayer -identify movie-filename -nosound -vc dummy -vo null   
这样会输出一大堆影片信息,从中截取所需内容即可,在bash shell中,取得影片总时间长度(以秒为单位)的命令如下:

FILESIZE=`mplayer -identify -nosound -vc dummy -vo null $1 | grep ID_LENGTH | sed -r 's/ID_LENGTH=([[:digit:]]*)(.[[:digit:]]*)?/1/g'`   
有了影片的总时长,我们就可以根据所要截取的帧数,计算出每个间隔点的时间位移了。不过要注意一般影片的开始-ss 0和结束-ss TOTAL_TIME_OF_VIDEO截取下来都会是黑屏,在处理的时候要分别加上和减去若干秒。

截取工作完成后,我们拥有了一堆000000xx.jpg文件,如果能把这些文件都放到一个文件中,每行2张,成为一张大图片,在发布的时候会很方便。所以,我们使用imagemagick(http://www.imagemagick.org/script/index.php)中的montage命令来实现:

montage -geometry +0+0 -tile 2 *.jpg montage.jpg   
-geometry +0+0是设定使用原始图片大小,-tile 2参数设定每行放2张图片,最后一个参数是要生成的目标文件名,现在,我们就能够得到像刚才那张一样的图片了。

原理已经讲清楚了,可以自己写一个bash脚本来方便调用,我在网上找到了一个很不错的例子(http://www.linuxquestions.org/questions/showthread.php?t=361072),可以在这个基础上进行修改,过程不再详述了。

下面再列一些在网上找到的其他mplayer、mencoder、ffmpeg的使用实例:

mplayer获取影片信息
mplayer -identify movie-filename -nosound -vc dummy -vo null
从所有输出中可以grep到如下信息:
- filetype: ASF file format detected.
- dimensions and format: VIDEO: [MP43] 320×240 24bpp 1000.000 fps 0.0 kbps ( 0.0 kbyte/s)
- video format: ID_VIDEO_FORMAT=MP43
- width (dimensions): ID_VIDEO_WIDTH=320
- height (dimensions): ID_VIDEO_HEIGHT=240
- length in seconds: ID_LENGTH=98.00
参考8(http://gallery.menalto.com/node/40548)

mencoder图片做成电影
#用当前目录中的所有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
简单用法:
mencoder *.jpg -mf on:fps=15 -o output.avi -ovc xvid
参考6 参考7(http://huangjiahua.livejournal.com/99358.html)

ffmpeg屏幕录像
ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -s 1024×768 ~/test.avi
其中,-vd x11:0,0 指录制所使用的偏移为 x=0 和 y=0,-s 1024×768 指录制视频的大小为 1024×768。录制的视频文件为 test.avi,将保存到用户主目录中。其他选项可查阅其说明文档。
如果你只想录制一个应用程序窗口或者桌面上的一个固定区域,那么可以指定偏移位置和区域大小。使用xwininfo -frame命令可以完成查找上述参数。
你也可以重新调整视频尺寸大小,如:./ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -i ~/test.avi -s 800×600 ~/test-800-600.avi。
参考5(http://linuxtoy.org/archives/ffmpeg.html)

mplayer对video进行截屏 截图(wmv mpeg mov flv all works)
mplayer 78.mov -ss 1 -nosound -vo jpeg:outdir=./ -frames 2
我截的第一张图不知为何全部都是黑屏
参考4(http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=165254)

转换为flv文件
mencoder NOW.wmv -ffourcc FLV1 -of lavf -ovc lavc -lavcopts vcodec=flv:acodec=mp3:abitrate=56 -srate 22050 -oac mp3lame -o NOW.flv
ffmpeg -i a.asf -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 asf.flv
参考3(http://www.roading.net/blog/article.asp?id=114)

使用ffmpeg抓图
ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352×240 b.jpg
jpg: ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352×240 -ss a.jpg //注意-ss就是要提取视频文件中指定时间的图像
jpg: ffmpeg -i asf.flv -y -f image2 -t 1 asf.jpg
gif: ffmpeg -i test.asf -vframes 30 -y -f gif a.gif
参考3 参考2(http://www.killflash.net/blog/article.asp?id=77)

如何合并几个视频片段
mencoder -oac copy -ovc copy -idx -o output.avi video1.avi video2.avi video3.avi
* 其中,-oac copy 选项告诉 mencoder 要正确拷贝音频流。而 -ovc copy 选项则是拷贝视频流。
* 如果在视频文件中没有找到索引的话,那么 -idx 选项会要求 mencoder 建立它。
* -o 选项指定输出文件的名称。
* 最后几个参数为需要合并的几个视频片段。
参考1 (http://linuxtoy.org/archives/join_several_videos.html)

大杂烩
服务器端转换工具(Server-Side-FLV-Conversion)
场景:想把 MPG 或 AVI 上传到你的服务器并自动转换成 FLV 吗?
1,FFmpeg (http://sourceforge.net/projects/ffmpeg) | 教程一 (http://soenkerohde.com/tutorials/ffmpeg) | 教程二 (http://klaus.geekserver.net/flash/streaming.html)(Google Video 使用的就是这个东东.)
2,Flix Engine (http://www.on2.com/developer/flix-engine-sdk) | 教程 (http://www.flexauthority.com/articlesIndex.cfm) | 范例 (http://www.flexauthority.com/Samples/FlixEngine/index.html)
3,Turbine Video Engine (http://www.blue-pacific.com/products/turbinevideosdk/default.htm)
4,Video to Flash Console (http://www.geovid.com/Video_to_Flash_Console)

录像/实时广播(Record/Broadcast)
场景:想制作一个语音视频Blog满足自恋的欲望吗?
1,RED5 (http://www.osflash.org/red5)
2,Flash Media Server (http://www.macromedia.com/go/fms)
在线编码,分享视频(Online Encode & Share)
场景:想不花钱就可以在线分享你的视频吗?
1,Google Video (http://video.google.com/)
2,You Tube (http://www.youtube.com/)
本地 FLV 文件播放器(FLV Player)
场景:拿到了 FLV 文件不知道怎么播放了.
1,martijndevisser FLV Player (http://www.martijndevisser.com/2005/10/flv_player_updated.html)
2,FlashGuru FLV Player (http://www.flashguru.co.uk/free-tool-flash-video-player)
3,FCZone FLV Player (http://fczone.com/2006/01/fms-media-player.cfm)
在线 FLV 文件播放器(Online FLV Player)
场景:知道一个在线FLV地址,又懒得下载和安装播放器.
1,Loadr (http://dengjie.com/loadr)
2,Google Player Generator (http://dengjie.com/loadr/r.swf?file=/temp/google_player.swf&clr=000FFF)
更多相关软件看这篇文章:Flash 网站的视频策略 (http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_14571)

此文章转自 shadow

ffmpeg 参数

利用ffmpeg+mencoder视频转换的总结
http://www.yitian130.com/article.asp?id=69

flv视频转换和flash播放的解决方案笔记
http://blog.verycd.com/dash/showentry=35982

Youtube技术原理
1. 网页文件允许上传视频文件(这个和上传其他文件一样的)(作者用的是python的架构)
2. 后台调用ffmpeg对上传的视频进行压缩,输出flv格式的文件。这个开源程序win32和linux都有实现,所以可以适应不用的主机环境。
3. 使用flvtools处理flv文件,标记上时长、帧速、关键帧等元数据,这样的flash文件才可以拖放。
4. 使用 ffmpeg 产生flv文件的缩略,和大图像文件的缩略图是一个道理。
5. 使用适当的flv播放器在网页中播放服务器端生成的flv文件。
更多详细:http://www.gotonx.com/bbs/simple/index.php?t6322.html

安装和使用ffmpeg转换视频为flv文件(windows和linux)

1、环境winxp-sp2下:
从 http://ffdshow.faireal.net/mirror/ffmpeg/ 下载
最新版本的 FFMpeg.exe直接用就行(须rar解压)。

以下的东西是为对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等)转换用的,
从http://mediacoder.sourceforge.net/download_zh.htm下载
最新版本的mediacoder的安装后;找到其中的mencoder.exe;drv43260.dll和pncrt.dll三个文件。

2、环境linuxas4。3下:

a、先装mp3在linux下的包:lame-3.97.tar.gz;
tar -xvzf lame-3.97.tar.gz;
cd lame-3.97;
//(默认是装在/usr/local下);
//--prefix=/usr/此参数一定要(便于调用os的其它系统包)
//--enable-shared此参数一定要
./configure --enable-shared --prefix=/usr/;
make;
make install;

b、支持3gp格式,这也是现在好多手机支持的格式,因为手机用户是我们的主要用户,所以也得支持编译

编译的时候加上--enable-amr_nb --enable-amr_wb参数就行,根据编译系统的提示,所以我们得下载一些编译3gp所需得文件。

wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-510.zip
解压以后把里面的文件都拷贝到libavcodec/amrwb_float/

wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-510.zip
解压以后把里面的文件都拷贝到libavcodec/amr_float/

c、mpg4 aac格式支持,由于服务器还针对手机用户服务,所以,类似aac,mpg4铃声格式的支持,我们也得做。这里我们安装faad2和faac就行
下载请到http://www.audiocoding.com/modules/mydownloads/

tar zxvf faad2-2.5.tar.gz
cd faad2
echo > plugins/Makefile.am
echo > plugins/xmms/src/Makefile.am
sed -i '/E_B/d' configure.in
autoreconf -vif
./configure --prefix=/usr
make &&
make install

tar zxvf faac-1.25.tar.gz
cd faac
sed -i '/[2de].M/d' configure.in
echo "AC_OUTPUT(common/Makefile common/mp4v2/Makefile libfaac/Makefile frontend/Makefile include/Makefile Makefile)" >> configure.in
autoreconf -vif
./configure --prefix=/usr
make &&
make install

d、支持xvid; x264,现在最流行的两种高质量的压缩格式
xvid的编译安装
wget http://downloads.xvid.org/downloads/xvidcore-1.1.2.tar.gz
tar zvxf xvidcore-1.1.2.tar.gz

cd xvidcore-1.1.2/build/generic
./configure --prefix=/usr --enable-shared
make
make install

x264的获取同样是采用svn方式:
svn co svn://svn.videolan.org/x264/trunk x264

linux下须从http://www.kernel.org/pub/software/devel/nasm/binaries/linux/下载nasm-0.98.39-1.i386.rpm

在linux下安装就行了。。。

rpm -ivh nasm-0.98.39-1.i386.rpm(如-ivh不行就用-Uvh)

cd x264
./configure --prefix=/usr --enable-shared
make
make install

e、安装ffmpeg:
//as4.3系统已经支持ac3编码,只要加--enable-a52 --enable-gpl参数就行
//我加--enable-shared参数没有成功
./configure --prefix=/opt/ffmpeg/ --enable-mp3lame --enable-amr_nb --enable-amr_wb --enable-a52 --enable-xvid --enable-x264 --enable-faad --enable-faac --enable-gpl --enable-pthreads;
make clean;//一定要;否则有可能没声音。
make;
make install;

在相应windows和linux目录下(有ffmpeg文件的;以下用linux下说明):
3、使用ffmpeg转换视频为flv文件:
./ffmpeg -i "/opt/input/1.mpg" -y -ab 32 -ar 22050 -b 800000 -s 640*480 /opt/output/1.flv"
ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
./mencoder /input/a.rmvb -oac lavc -lavcopts acodec=mp3:abitrate=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o /output/a.avi
在执行./ffmpeg -i "/opt/input/a.avi" -y -ab 32 -ar 22050 -b 800000 -s 640*480 /opt/output/a.flv"就可以转了。

4、视频抓图:
./ffmpeg -i "/opt/input/a.flv" -y -f image2 -t 1 -s 300*200 "/opt/output/1.jpg" //获取静态图

./ffmpeg -i "/opt/input/a.mpg" -vframes 30 -y -f gif "/output/1.gif" //获取动态图;
不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。

用mencoder在线转换视频格式并控制视频品质
http://blog.sina.com.cn/u/490343a7010006z6

Linux系统下视频转换:Mencoder和Ffmpeg

时间:2010-11-18 16:54 来源:51CTO 收藏 复制分享 共有评论(0)条

  ◆Linux下的视频转换:mencoder

  制作适合在智能手机和PDA上观看的mpeg4视频。

  Linux上有一个很强大的视频音频转换软件,就是Mplayer自带的mencoder (MPlayer's Movie Encoder)。mencoder就象是一台全手动的照相机,可调整的选项非常多,不过这儿只是把最常见的情况说一下。

  转换avi文件,并把字幕内嵌到视频中。首先假设一下下列的条件:

  文件名:video.avi

  字幕文件名:video.srt

  目标文件:new.avi

  目标文件格式:mpeg4

  目标文件视频码率:200

  目标文件音频码率:64

  目标文件分辨率: 320:240

  制作内嵌字幕所需的字体:simsun.ttf

  (上面各项都可以根据实际情况进行调整)

  转换命令如下:

  mencoder-oac mp3lame -lameopts vbr=3:br=64 -ovc lavc -lavcoptsvcodec=mpeg4:mbd=1:vbitrate=200 -sub video.srt -o new.avi -fontsimsun.ttf video.avi -subcp cp936 -subfont-text-scale 4 -vfscale=320:240

  各选项的含义:

  -oac 编码文件的音频部分。这儿是用lame将音频encode成mp3,即mp3lame。其他可用的选项可以调用mencoder的man page查看。

  -lameopts 顾名思义,即lame选项,这儿只需定义一下码率就可以了。

  vbr 设定音频码率的方法,格式为vbr=<0-4>

  0 cbr average bitrate

  1 mt

  2 rh constant bitrate Also forces CBR mode encoding on subsequent ABR presets modes.

  3 abr

  4 mtrh

  在这儿用的是3,abr。

  br 就是设定我们所需要的码率值,格式为br=<0-1024>,只能在vbr为0和3的情况下才能使用该选项。

  -ovc 编码文件的视频部分。主要有以下几个选项

  -ovc copy

  不进行编码,只是复制视频流

  -ovc divx4

  编码成DivX4/DivX5

  -ovc raw

  编码成任意不压缩的格式(用‘-vf format’设定具体的格式)

  -ovc lavc

  使用libavcodec进行编码

  -lavcopts 就是libavcodec的选项。

  vcodec=使用指定的视频编码,下面列一下几个主要的值

  h264

  H.264

  h263

  H.263

  h263p

  H.263+

  mpeg4

  MPEG-4 (DivX 4/5)

  msmpeg4

  DivX 3

  msmpeg4v2

  MS MPEG4v2

  wmv1

  Windows Media Video, version 1 (又称 WMV7)

  wmv2

  Windows Media Video, version 2 (又称 WMV8)

  rv10

  旧的RealVideo格式

  mpeg1video

  MPEG-1 video

  mpeg2video

  MPEG-2 video

  mbd 决定视频宏块的算法,这儿只需要mbd=1即可。其余的可以查看man page。

  vbitrate 设定视频的码率(默认为800)。

  -sub 设定字幕文件

  -o 目标视频文件

  -font 制作内嵌字幕所需字体的路径

  -subcp 字幕的编码,简体中文就是cp936

  -subfont-text-scale 字幕字体的大小

  -vf scale 视频的分辨率

  如果不需要将字幕内嵌入视频文件,只需要去掉-sub、-font、-subcp、-subfont-text-scale这几个选项。将rmvb转换成mpeg4也是如此。
原创粉丝点击