存档

文章标签 ‘视频处理’

[转]ffmpeg和Mencoder使用实例小全

2008年11月6日

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

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

 

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

mplayer -ss START_TIME -noframedrop -nosound -vo jpeg -frames N NAME_OF_VIDEO_FILE   
上 例中,-ss指定开始的时间,结合-frames参数,限定从某个时间开始、截取几帧图像。为了体现整个影片的内容,我需要在影片中间隔时间相同的几个 点、每个点截取1帧图像,所以按道理应该用-frames1,但是mplayer这样截图的情况下,第一帧似乎永远都会截取到一个黑屏,所以我常用- frames2。截取下来的图像保存在了当前目录,名称从00000001.jpg开始依次递增,按照-frames2,就是取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 | grepID_LENGTH | sed -r ‘s/ID_LENGTH=[[:digit:]]*.[[:digit:]]*?/1/g’`   
有了影片的总时长,我们就可以根据所要截取的帧数,计算出每个间隔点的时间位移了。不过要注意一般影片的开始-ss 0和结束-ss TOTAL_TIME_OF_VIDEO截取下来都会是黑屏,在处理的时候要分别加上和减去若干秒。

截取工作完成后,我们拥有了一堆000000xx.jpg文件,如果能把这些文件都放到一个文件中,每行2张,成为一张大图片,在发布的时候会很方便。所以,我们使用imagemagickhttp://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
参考8http://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 JPEGMJPEG文件:
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 参考7http://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。
参考5http://linuxtoy.org/archives/ffmpeg.html

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

转换为flv文件
mencoder NOW.wmv -ffourcc FLV1 -oflavf -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
参考3http://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 参考2http://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.htmlGoogle 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_OUTPUTcommon/Makefile common/mp4v2/Makefile libfaac/Makefilefrontend/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)转换为aviffmpeg能解析的格式.
./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

备忘录 ,

我使用的flv转换代码

2008年11月6日

首先解压视频文件

rarcomm = “cmd.exe /c ” & “e:cnrarrar.exe  x ” & filepath & rarname & ” -w ” & swfpath & “  -c -y -inul”

获取视频截图

getpic = “cmd.exe /c F:mencodermplayer ” & newswf & ” -ss 1 -nosound -vo jpeg:outdir=v -frames 2 ”
FileCopy App.Path & “v0000002.jpg”, picname
Kill App.Path & “v0000001.jpg”
Kill App.Path & “v0000002.jpg”

获取视频信息

vinfo = “cmd.exe /c F:mencodermplayer -identify ” & newswf & ” -nosound -vc dummy -vo null >>” & picpath & id & “.txt”

这里原来考虑直接使用上面getpic所获得的信息,但其主要是少一项视频时间,没有办法只有单独获取了

转换成flv

flvcom = “cmd.exe /c F:mencodermencoder.exe ” & newswf & ” -o “”” & flvname & “”” -of lavf -oac mp3lame -lameopts abr:br=32:vol=1 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=400:mbd=2:v4mv:turbo:vb_strategy=1:last_pred=2:trell:mv0:
dia=4:cbp -vf scale=320:-3 -subpos 100  -subwidth 100 -subfont-text-scale 3 -utf8 -font “”F:mencoderMSYHBD.TTF”” -sub “”F:mencodertest.srt”””

水印的问题:

mencoder使用srt,主要的问题是水平位置的控制 和字幕编码的问题。

水平位置:好像没有具体的参数来配置字幕的水平位置只有-subpos来控制垂直的位置,经过测试你可以在srt字幕文件中以空格的方式来控制水平(视频的宽度也有影响,需要根据视频宽度调整),另外-subwidth 决定了字幕的宽度,是否会分两行显示。
对于rmvb wmv等可变码率格式的文件在转换时要确定帧率否则音画不同步 -ofps 12

我的网站 , ,

【转】ffmpeg+mencoder环境搭建和视频处理总结

2008年11月6日

 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…
   如果官网下载有问题的,xplore也提供了1月30的snapshot:下载ffmpeg.

   lame下载:当前版本为3.97,http://sourceforge.net/pro…
    或者到xplore下载lame.
   ogg vorbis:这个一般的redhat自带,不需要下载.可以去看看/usr/lib/libvorbis.a在不在,如果不在可以yum install或apt-get install.
   xvid下载:http://downloads.xvid.org/…, xplore下载xvid.
   x264下载:这个可以去ftp://ftp.videolan.org/下寻找最近的snapshot下载,或者svn获取,注意如果ffmpeg是什么时候的,x264的snapshot也应该是什么时候的,不然编译的时候容易报错.ftp://ftp.videolan.org/pub…
   xplore下载x264的1月29日的snapshot.
   libdts:http://download.chinaunix…., xplore下载libdts:
 上面的软件包除了ffmpeg之外,在下载完成后解包,编译的参数都是./configure –prefix=/usr –enable-shared;make;sudo make install

   mpeg4 aac/aad2:http://www.audiocoding.com…,http://www.audiocoding.com…
 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/Sp…,解压的源代码文件以后把里面的文件都拷贝到ffmpeg的源代码目录下libavcodec/amrwb_float;然后下载:http://www.3gpp.org/ftp/Sp…,解压得源代码文件以后把里面的文件都拷贝到ffmpeg解包目录下的libavcodec/amr_float,然后交给ffmpeg编译去做了.
   也可以在这里下载这两个包:amrwb_float下载,amr_float下载.

   PS: 其实上面很多lib库可以不需要手动编译的.在安装开源的vlc播放器时有很多自己都可以通过yum自动安装好.如果嫌麻烦可以先用yum安装好vlc,例如这样:

引用
sudo rpm -ivh http://rpm.livna.org/livna…
sudo yum install vlc
/* sudo yum install python-vlc mozilla-vlc (optionnal) */

   于是,便可以看到:

引用
Installing:
vlc                     i386       0.8.6c-4.lvn6    livna             6.5 M
Installing for dependencies:
a52dec                  i386       0.7.4-10.lvn6    livna              49 k
aalib                   i386       1.4.0-0.11.rc5.fc6  extras             74 k
dirac-libs              i386       0.7.0-1.fc6      extras            386 k
faac                    i386       1.25-2.lvn6      livna              82 k
faad2                   i386       2.0-19.20050131.lvn6  livna             209 k
ffmpeg-libs             i386       0.4.9-0.37.20070503.lvn6  livna             1.6 M
freeglut                i386       2.4.0-11.fc6     extras            142 k
gsm                     i386       1.0.12-3.fc6     extras             27 k
imlib2                  i386       1.3.0-3.fc6      extras            576 k
jack-audio-connection-kit  i386       0.103.0-1.fc6    extras            138 k
lame-libs               i386       3.97-4.lvn6      livna             331 k
libcaca                 i386       0.99-0.1.beta11.fc6  extras            160 k
libcddb                 i386       1.3.0-1.fc6      extras             71 k
libcdio                 i386       0.78.2-2.fc6     extras            268 k
libdca                  i386       0.0.2-3.lvn6     livna             103 k
libdvbpsi               i386       0.1.5-2.lvn6     livna              39 k
libdvdnav               i386       0.1.10-3.20070503.lvn6  livna             123 k
libdvdread              i386       0.9.7-2.fc6      extras             66 k
libebml                 i386       0.7.7-2.fc6      extras             72 k
libfreebob              i386       1.0.0-3.fc6      extras            155 k
libid3tag               i386       0.15.1b-3.fc6    extras             44 k
libmatroska             i386       0.8.0-4.fc6      extras            199 k
libmodplug              i386       1:0.8.4-1.fc6    extras            167 k
libmp4v2                i386       1.5.0.1-3.fc6    extras            279 k
libmpcdec               i386       1.2.2-4.fc6      extras             30 k
libshout                i386       2.2.2-1.fc6      extras             43 k
libsndfile              i386       1.0.17-2.fc6     extras            227 k
libtar                  i386       1.2.11-8.fc6     extras             29 k
libupnp                 i386       1.6.0-1.fc6      extras            101 k
lirc                    i386       0.8.1-1.fc6      extras            240 k
mpeg2dec                i386       0.4.1-2.lvn6     livna             101 k
svgalib                 i386       1.9.25-3.fc6     extras            465 k
twolame                 i386       0.3.10-1.lvn6    livna              79 k
vcdimager               i386       0.7.23-3.lvn6    livna             657 k
x264                    i386       0-0.8.20061028.lvn6  livna             241 k
xosd                    i386       2.2.14-9.fc6     extras             47 k
xvidcore                i386       1.1.3-1.lvn6     livna             242 k

   这些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做视频转换截图了.
   当然,上面那些codec的编译是相当乏味的.你也可以根本不理会这些.因为最新版本的ffmpeg已经比以前支持更多的格式了.因此也可以只安装lame,xvid,x264就可以了.下面是两种配置下支持的格式diff -w的结果:

引用
2c2
<   configuration:  –prefix=/usr –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

>   configuration:  –prefix=/usr/local –enable-mp3lame
6c6
<   built on Jan 30 2007 17:55:22, gcc: 4.1.1 20061011 (Red Hat 4.1.1-30)

>   built on Jan 30 2007 17:46:19, gcc: 4.1.1 20061011 (Red Hat 4.1.1-30)
40c40
<  DE gxf             GXF format

>  D  gxf             GXF format
72c72
<  DE ogg             Ogg Vorbis

>  D  ogg             Ogg
111d110
<  DEA    aac
113c112
<  DEA    ac3

>   EA    ac3
132,133d130
<  DEA    amr_nb
<  DEA    amr_wb
147d143
<  D A    dts
164c160
<  DEV DT h264

>  D V DT h264
190d185
<  D A    mpeg4aac
275d269
<   EV    xvid

   
   3)mencoder篇
   首先获取mplayer软件包极其mplayer官网上自带的codecs.如果喜欢mplayer,也可以下载gui和font.关于mplayer-1.0rc1在71.21的/home/zhengyu/tools中能找到.如果需要网上下载,可以去官网:http://www.mplayerhq.hu/de…下载rc1地址如下:http://www1.mplayerhq.hu/M…最新的svn版本:http://www1.mplayerhq.hu/M…官网同时也给出了一些codec,其中就有rm格式的codec:http://www1.mplayerhq.hu/M…
    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/pos…这里不作详细的列举了.

   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://bbs.chinavideo.org/…
http://bbs.hljradio.com/ht…
http://blog.sina.com.cn/u/…
http://blog.chinadaily.com…
http://ken.bokele.com/?CH=…

备忘录 ,