全部博文(187)
分类: LINUX
2009-11-09 16:50:45
本文标签(Tag) | |
1 ffmpeg介绍 ffmpeg是音视频的分离,转换,编码解码及流媒体的完全解决方案,其中最重要的就是libavcodec库。它被mplayer或者xine使用作为解码器。还有,国内比较流行的播放器影音风暴或MyMPC的后端ffdshow也是使用ffmpeg的解码库的。 ffmpeg软件包经编译过后将生成三个可执行文件,ffmpeg,ffserver,ffplay。其中ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。 ffmpeg 中有五个库文件,libavcodec,libavformat,libavutil,libswscale,libpostproc,其中库 libavcodec,libavformat用于对媒体文件进行处理,如格式的转换;libavutil是一个通用的小型函数库,该库中实现了CRC校验码的产生,128位整数数学,最大公约数,整数开方,整数取对数,内存分配,大端小端格式的转换等功能;libswscale,libpostproc 暂时不知道何用。 2 ffmpeg下载 最新的ffmpeg可以通过svn下载,SVN辅助的软件有: SubVersion,从 下载,支持linux。 TortoiseSVN,从 下载,是很不错的SVN客户端程序,为windows外壳程序集成到windows资源管理器和文件管理系统的Subversion客户端,用起来很方便。 subversion安装,记住最好之前装过apr和apr-util,在apache.org网站能下到 wget tar zvxf subversion-1.3.2.tar.gz cd subversion-1.3.2 ./configure --with-apr=/usr/local/apr-httpd --with-apr-util=/usr/local/apr-util-httpd/ make make install 如果安装了FC6,它已经带了svn,不用装了。 ffmpeg的下载:我们就可以通过svn命令获取最新的ffmpeg,命令如下: svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg 3 ffmpeg支持库的安装 * xvid xvid的获取地址如下: wget 配置编译 for x86 #./configure --prefix=/usr/local #make #make install for arm #CC=arm-linux-gcc ./configure --prefix=/usr/local/arm/arm-linux --build=i686-pc-linux --host=arm-linux --target=arm-linux #make #make install * x264 x264的获取地址如下: svn co svn://svn.videolan.org/x264/trunk x264 配置编译 for x86 #./configure --enable-shared --prefix=/usr/local #make #make install for arm #CC=arm-linux-gcc ./configure --enable-pthread --enable-shared --host=arm-linux --prefix=/usr/local/arm/arm-linux #make #make install * 支持mp3 lame的获取地址如下: 配置编译 for x86 ./configure --enable-shared --prefix=/usr/local * 支持Ogg Vorbis: * AC3和dts编码的支持 libdts编译参数 ./configure --prefix=/usr make make install * mpg4 aac格式支持, 如果ffserver服务器还针对手机用户服务,所以,类似aac,mpg4铃声格式的支持,我们也得做。这里我们安装faad2和faac就行,下载请到, FAAD2的编译 cd faad2 autoreconf -vif ./configure --prefix=/usr --with-mp4v2 --enable-shared make make install faac的编译 cd faac chmod +x bootstrap ./bootstrap ./configure --prefix=/usr --with-mp4v2 --enable-shared make make install 在编译ffmpeg,在configure时加上--enable-amr_nb --enable-faad --enable-faac参数。 * 支持3gp格式, 这也是现在好多手机支持的格式,所以也得支持编译, 编译的时候加上--enable-amr_nb --enable-amr_wb参数就行,根据编译系统的提示,所以我们得下载一些编译3gp所需得文件。 源码网址: wget 解压以后把里面的文件都拷贝到libavcodec/amrwb_float wget 解压以后把里面的文件都拷贝到libavcodec/amr_float * ffmpeg支持VC1格式 微软ASF格式的三个版本,WMV1,WMV2,WMV3分别对应MediaPlayer的版本7,8和9,所以很多时候会称VC1为WMV3或WMV9,都是它了,有时候在代码里,也能看到称呼它为VC9的。因为微软还没有正式公开这种格式,所以当前对VC1的支持还很不完善。本文基本是根据 Multimedia Mike 的一篇博客翻译和完善而来。 (1) 首先要下载 SMPTE VC-1 reference decoder,这个组织是要收费的,可以从这里下载免费的。 (2) 在ffmpeg目录下的libavcodec目录下面,建立目录libvc1。 (3) 将VC1_reference_decoder_release6/decoder/目录中的*.c和*.h文件全部copy到libvc1目录下。 (4) 将VC1_reference_decoder_release6/shared/目录中的*.c和*.h文件全部copy到libvc1目录下。 (5) 将 libvc1-makefile.txt放到libvc1下的Makefile文件。 (6) 将smpte-vc1.c文件放到libavcodec目录下。 (7) 修改libavcodec目录下的vc9.c,将文件最后的wmv3_decoder这个AVCodec的structure,用#if 0和#endif包含起来,也就是使它失效了。 (8) 修改libavcodec目录下的allcodecs.c,将register_avcodec(&wmv3_decoder)上下的注释去掉,使它发挥作用。 (9) 修改libavcodec目录下的Makefile,把OBJS的列表中加入smpte-vc1.o。 (10)修改ffmpeg主目录下的Makefile文件,把-L./libavcodec/libvc1 -lvc1$(BUILDSUF)加入到FFLIBS后面。 (11) 进入ffmpeg/libavcodec/libav1,执行make (12) 到ffmpeg主目录下,执行config;make;make install。config时根据实际情况带参数。 * 采用ffmpeg转码制作FLV文件的方法 采用ffmpeg转码制作FLV文件,和转码成其它媒体类型的重要差别是一定要有lame库支持,因为FLV的声音编码采用mp3格式,非lame这个东东不行。编译ffmpeg中加入lame库真是一场灾难,特别在windows下,很多参数都不能发挥作用,最后直接手工copy和改一些文件,记录如下: (1) 如果在Windows下编译,第一步当然是下载MinGW和MSYS来装上了。到去下载最新版的MinGW-5.0.2.exe和MSYS-1.0.11-2004.04.30-1.exe。 (2) 先安装MinGW,直接运行MinGW-5.0.2.exe安装,选择目录,譬如选择D:\MinGW为安装目录。安装时需要选择gcc和make模块,安装文件本身很小,会从网上下载模块来安装。 (3) 然后安装MSYS,也是直接运行MSYS-1.0.11-2004.04.30-1.exe安装。安装目录一般选择D:\MinGW\bin \1.0。,安装过程会询问刚才安装MinGW的目录,输入D:\MinGW,其它都回答'Y'就搞定了。如果不清楚,可以看这个图片效果。 (4) 运行MSYS,桌面上有个图标,双击就运行了,运行结果是一个模拟unix的命令窗口,后面的编译都在这种状态下进行。前面4步在linux不需要。 (5) 到去下载最新版的lame-3.97b2.tar.gz,copy到你认为合适的地方,解压后进入lame解压出来的目录中。执行 ./configure --prefix=PREFIX make make install (6) 就把编译出来的include下的lame目录copy到/usr/include目录下,把lib下的几个库文件都copy到/usr/lib目录下。这里注意有个变化,如果只copy lib目录下的静态库到/usr/lib下,就是只copy libmp3lame.a文件,编译出来的ffmpeg最终就不会对libmp3lame的动态库有依赖关系,这是因为编译首先找动态库,动态库没有才找静态库。如果不做这个copy,后面编译ffmpeg时无论如何指定参数,都会报错LAME not found,不知道是哪里的bug。 (7) 从取得最新的ffmpeg,现在自由软件都大量采用SVN了,要先装一个SVN,可以去下载windows版的SVN,去下载linux版的SVN。SVN如何编译安装这里就省略了。 (8) 如果在windows下,打开解压后的ffmpeg目录下的Makefile文件,在FFLIBS的那一行后面加上-lmp3lame$(BUILDSUF)。这个也不知道是哪个bug引起的,搞了好长时间才搞出来,郁闷。Linux下不用这样。 4 ffmpeg的编译 配置编译 for x86 #./configure --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 make make install 补充1: 关于3gp的编译,如果大家要编译--enable-amr_nb-fixed,那就不能跟--enable-amr_nb同时编译,我不大清楚这两者到底有什么区别,似乎fixed是修正版,管他呢,编译的方法: wget 解压以后把里面的文件都拷贝到libavcodec/amr目录下 修改libavcodec/amr/makefile 找到CFLAGS = -Wall -pedantic-errors -I. $(CFLAGS_$(MODE)) -D$(VAD) 换成CFLAGS = -Wall -I. $(CFLAGS_$(MODE)) -D$(VAD) -DMMS_IO 整体编译参数就是 #./configure --prefix=/usr --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb-fixed --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-dts --enable-pp --enable-faad --enable-faadbin --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay make make install for x86的简易配置 #./configure --prefix=./install --disable-shared --enable-pthreads --enable-libx264 --enable-libxvid --arch=i686 --enable-gpl #make #make install for arm 配置编译 #./configure --prefix=/home/zht/redhatzht/sources/image-colletct/ffmpeg/install --enable-static --disable-shared --enable-libx264 --enable-libxvid --cross-compile --cc=arm-linux-gcc --arch=arm --enable-gpl --disable-strip --disable-network --disable-ipv6 --disable-vhook --disable-audio-beos --disable-audio-oss --disable-mpegaudio-hp --enable-pthreads --enable-small --disable-parsers --disable-debug #make #make install 注意: (1)“/home/zht/redhatzht/sources/image-colletct/ffmpeg”为ffmpeg源码所在目录。 (2)“/usr/local/arm”为arm-linux-gcc交叉编译器所在目录。 (3) 如果库文件安装在/usr/local/lib目录中导致配置失败,可以在/etc/ld.so.conf文件中添加/usr/local/lib目录,然后执行#ldconfig。 x86上的ldconfig不能在arm上运行,arm上的ldconfig工具是在建立交叉编译器时,编译glibc是产生的,可以拷贝到arm-linux中。 (4) 本文大部分内容来自网络,其中xvid,x264的库,我亲手安装过,ffmpeg的配置编译for x86的简易配置,for arm,我亲手配置编译过,并在x86,arm上可用,编译配置都是采用静态库。 |