本文标签(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,从 http://subversion.tigris.org/ 下载,支持linux。

    TortoiseSVN,从 http://tortoisesvn.tigris.org/ 下载,是很不错的SVN客户端程序,为windows外壳程序集成到windows资源管理器和文件管理系统的Subversion客户端,用起来很方便。

 

    subversion安装,记住最好之前装过apr和apr-util,在apache.org网站能下到

    wget http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz    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的获取地址如下: http://www.xvid.org/

    wget http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz

    配置编译

    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的获取地址如下: http://lame.sourceforge.net/index.php

    配置编译

    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就行,下载请到http://www.audiocoding.com/modules/mydownloads/http://prdownloads.sourceforge.net/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所需得文件。

源码网址:http://www.3gpp.org/ftp/Specs

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

 

* 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来装上了。到http://mingw.sourceforge.net/去下载最新版的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) 到http://lame.sourceforge.net/去下载最新版的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) 从http://ffmpeg.mplayerhq.hu/取得最新的ffmpeg,现在自由软件都大量采用SVN了,要先装一个SVN,可以去http://tortoisesvn.tigris.org/下载windows版的SVN,去http://subversion.tigris.org/下载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是修正版,管他呢,编译的方法:

解压以后把里面的文件都拷贝到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上可用,编译配置都是采用静态库。