ffmpeg 在linux下编译

1、下载ffmpeg。 

    wget http://down1.chinaunix.net/distfiles/ffmpeg-0.4.9-p20051120.tar.bz2 

  我是在这个网址上下载ffmpeg-0.4.9-p20051120.tar.bz2,看网上有人用的是svn下载,但是我的机子中没有svn客户端,然后就在网上搜索,下载了这个版本。如果利用svn可以下载ffmpeg最新的版本。 

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

  2、解压 

  tar xvfj ffmpeg-0.4.9-p20051120.tar.bz2 

  得到解压后的目录是ffmpeg-0.4.9-p20051120,名字太长,利用mv命令改为ffmpeg 

  mv ffmpeg-0.4.9-p20051120.tar.bz2 ffmpeg 

  3、配置 

  ./configure --enable-shared --prefix=/usr/local/ffmpeg 

  其中:--enable-shared 是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。--prefix设置的安装目录。 

  4、编译并安装 

  make 
  make install 

  5、安装之后在/usr/local/ffmpeg会看到有三个目录 

  lib 动态链接库位置 
  include 编程要用到头文件 
  bin 执行文件所在的目录 

  6、为了以后方便编程,我们把lib中的三个链接库libavcodec.so libavformat.so libavutil.so复制到/usr/lib下。把include目录下的ffmpeg目录复制到/usr/include下。 

这里我这样复制了还是不对,-lavcodec -lavutil -lavformat的时候,提示找不到库
然后我把 /usr/local/ffmpeg/lib  所有文件复制到 /usr/local/lib才可以的
  执行bin目录下的ffplay,可以去播放音频或者视频文件。例如播放1.mp3 

  ./ffplay 1.mp3 

  另外,bin目录下还有两个文件:ffmpeg和ffserver 

  ffmpeg是一个很好的视频和音频的格式转化工具。网上有很多它的说明文档。如果不想生成ffserver,只要在./configure的时候加--disable-ffserver即可。 

  7、编程 

  如果写了一个test.c文件,要包含ffmpeg的头文件,可以这样写: 

  #include 

  编译:gcc -o test test.c -lavformat -lavcodec -lavtuil (前提是有第6步的操作) 

  如果没有第6部的操作,则编译的时候如下: 

  gcc -o test test.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil 

  编译成功之后,执行的时候还是需要动态库的支持,还是要把那三个动态库文件复制到/usr/lib或者/lib中,不然执行的时候会说找不到动态库链接。还有一个方法可以解决这个问题,就是把/usr/local/ffmpeg/lib这个目录加入到/etc/ld.so.config中,然后执行 ldconfig,或者重启电脑,这样执行的时候系统就可以从/usr/local/ffmpeg/lib这个目录下去找这三个动态库文件了。 

  以上的方式是采用动态库编译ffmpeg的,如果在configure的时候不加上--enable-shared的,则采用静态链接的方式,不会生成那三个动态库。同时生成的ffplay、ffmpeg的执行文件也比较的大,因为他们不需要动态库的支持,就可以执行。但是不利于再次开发,所以我采用动态链接的方式。configure中还有很多的选项,可以通过./configure --help查看,也可以直接查看configure文件。这在配置的时候很重要。


 前段时间移植servfox+spcaview到arm11上一直出现问题,由于网上很多说是内核版本高了,已经不再提供V4L的视频采集接口。而且servfox和spcaview都是支持V4L接口的,而不支持V4L2视频采集接口。所以产生不兼容的矛盾。虽然,我不太相信兼容的问题,但是又不愿意去实验低版本的内核(因为内核的交叉编译也是很烦的,而且漏洞百出,没工夫去研究),所以当把物理机的serfox和spcaview搞通了后就没有细致的去研究交叉编译serfox和spcaview了。后来就选择了ffmpeg。

        早就听说ffmpeg很强大了,特别是他的压缩率很高,特别适合于做视频保存。原先我在PC linux下把ffmpeg编译玩了一遍,后来交叉编译到arm板子估计就不费很大的事情了,不过也是要花时间的,废话少收,现在来说说我交叉编译的过程。

 

编译环境:          Vmware6.5+Fedora14

硬件平台:          S3C6410

编译器:              gcc-4.5.1、arm-linux-gcc-4.5.1

安装包及其版本:

                              SDL库文件:                SDL-1.2.13.tar.gz

                              yasm汇编器:              yasm0.7.2.tar.gz

                              MPEG视频编码器:    x264-snapshot-20111111-2245-stable.tar.bz2                 

                              MPEG视频编解码器:xvidcore-1.1.3.tar.gz

                              ffmpeg源码包:          ffmpeg-0.6.6.tar.gz

  一  安装ffplay所需的SDL库(如果我们不需要ffplay,这一步可以省略)

1  下载SDL-1.1.3.tar.gz,网上很容易找到安装包。我这里提供一个地址:http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz

2  #tar zxvf  SDL-1.2.13.tar.gz  ; cd SDL-1.2.13

3  # ./configure --prefix=/usr/local --host=arm-linux --enable-shared

4  修改一下Makefile

    将一下变量修改为下面这样:CC = arm-linux-gcc      AR = arm-linux-ar      RANLIB  = arm-linux-ranlib

5  #make

       可能会出现下面的错误:     

     ./src/audio/dma/SDL_dmaaudio.c: In function 'DMA_WaitAudio':
     ./src/audio/dma/SDL_dmaaudio.c:166:3: error: impossible constraint in 'asm'
     make: *** [build/SDL_dmaaudio.lo] Error 1

     配置中加上--disable-video-x11这一项

     那么重新配置Makefile

     #make clean

     #./configure --prefix=/usr/local --host=arm-linux --enable-shared --disable-video-x11

     #make

     同样执行第三步

6  make install

     这样,我们SDL库文件就安装完成了

二    安装yasm(yasmx264需要用到的汇编编译器,不过后来感觉没有多大作用)

1   下载yasm0.7.2,可以选择高一点的版本,这里提供一个下载地址:http://www.tortall.net/projects/yasm/wiki/Download

2   #tar zxvf yasm0.7.2.tar.gz  ; cd yasm0.7.2

3   #./configure --enable-shared --prefix=/usr/local/ --host=arm-linux
4   #make

5   #make install

三    x264视频编码器的安装

1  下载x264安装包,最好下高版本的,最近的安装包,不要太老了,否则会出现问题。因为x264安装包每天都在更新,这里提供下载网址:ftp://ftp.videolan.org/pub/videolan/x264/snapshots/

2   #tar jxvf x264-snapshot-20111111-2245-stable.tar.bz2 ; cd x264-snapshot-20111111-2245-stable

3   # ./configure --prefix=/usr/local --enable-shared --host=arm-linux  --disable-asm(第二步安装了yasm后就可以不用仅知道asm,但是没有--disable-asm就不行,大家可以尝试不加--disable-asm后看是什么效果)

4   修改Makefile

     主要是修改config.mak,将相关参数修改如下:CC=arm-linux-gcc     LD=arm-linux-gcc -o    RANLIB=arm-linux-ranlib    STRIP=arm-linux-strip

5   #make

6   #make install

四    安装视频编解码器xvid

1   下载xvid安装包,我这里提供了一个下载地址:http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz

2    #tar zxvf xvidcore-1.1.3.tar.gz ; cd xvidcore-1.1.3/build/generic

3    #./configure --prefix=/usr/local --host=arm-linux --target=arm-linux

      #./configure --prefix=/usr/local/ --host=arm-hismall-linux --target=arm-hismall-linux

      我还没研究透为何非要执行两次configure,不过如果只执行执行第一次configure,make就会出现下面的错误:

[root@sheryuan generic]# make
  D: =build
  C: ./decoder.c
cc1: error: unrecognized command line option "-freduce-all-givs"
make: *** [decoder.o] Error 1

4    修改Makefile

      一些编译环境变量修改如下:--cc=arm-linux-gcc   --as=arm-linux-as  --ranlib=arm-linux-ranlib(如果as通不过,就不用修改,--as=as)  

5    #make

6    #make install

五   安装ffmpeg

1    下载安装包,这里提供下载地址:http://ffmpeg.org/download.html

2    #tar zxvf ffmpeg-0.6.6.tar.gz ; cd ffmpeg-0.6.6

3    在/usr/local下新建目录ffmpeg-arm,将ffmpeg安装在此目录下

      #mkdir /usr/local/ffmpeg-arm

3    # ./configure --prefix=/usr/local/ffmpeg-arm --enable-shared --enable-cross-compile --arch=arm --cpu=armv6 --target-os=linux --cc=arm-linux-gcc --enable-libx264 --enable-libxvid --enable-gpl --enable-pthreads --disable-stripping --ar=arm-linux-ar --ld=arm-linux-gcc --strip=arm-linux-strip --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib

       如果是高版本,需要加上--cxx=arm-linux-g++参数;如果编译出现ar错误,就不要这个参数

       如果只需要安装ffmpeg,不需要全面安装ffplay,ffserver,ffprobe等附加程序,可以选用参数--disable-ffplay ,--disable-ffserver ,--disable ffprobe。但是根据我的测试发现,精简安装占用的空间比完全安装占用的空间少补了多少

4    修改Makefile

      修改如下RANLIB=arm-linux-ranlib

      如果需要安装ffplay,ffserver,ffprobe,那么确保CONFIG_FFPLAY=yes、CONFIG_FFPROBE=yes、CONFIG_FFSERVER=yes三项前面没有感叹号(!) 

5    #make

6    #make install

 六    打包 

      将安装的程序打包,包括可执行文件以及其执行依赖的库文件     

      #cd /usr/local

      因为我们将ffmpeg依赖的SDL、yasm、x264、xvid安装在将/usr/local目录下,所以他们生成的库文件在/usr/local/lib下,所以我们要将/usr/local/lib目录下libSDL、libyasm、libx264、libxvidcore等库文件拷贝到ffmpeg安装目录的lib文件夹下,也就是/usr/lcoal/ffmpeg-arm/lib目录下,然后打包

     #tar czvf  ffmpeg-0.6.6-arm.tar.gz ffmpeg-arm/*

     那么生成的ffmpeg-0.6.6-arm.tar.gz就可以拷贝到arm11上进行运行了

七    ARM平台上的配置

     我们可以将linux虚拟机下交叉编译生成的ffmpeg-0.6.6-arm.tar.gz包放到/usr/local目录下,解压

     #tar zxvf ffmpeg-0.6.6-arm.tar.gz

     解压后,在/usr/local目录下会生成ffmpeg-arm目录,这是我们需要将该目录下的库文件拷贝到可以将其作为全局变量的库文件夹下,我一一般将其放到了/usr/local/lib目录下

     #cp -rf ffmpeg-arm/lib/* lib/

     #cd ffmpeg-arm

     进入ffmpeg-arm目录,可以测试ffmpeg是否可用

 

    至此,安装过程完成,当然也可能会出现一些问题,下面我列举了些我安装过程遇到的问题。

问题一:编译SDL时make出现下面的情况

make出错:
./src/audio/dma/SDL_dmaaudio.c: In function 'DMA_WaitAudio':
./src/audio/dma/SDL_dmaaudio.c:166:3: error: impossible constraint in 'asm'
make: *** [build/SDL_dmaaudio.lo] Error 1

这是由于我们编译时没有加上--disable-video-x11参数,加上此项后编译可以通过

 

问题二:ffmpeg用configure生成Makefile时,出现ERROR: libx264 not found  或者 ERROR: libxvid not found

    在编译参数选择需要加上依赖的头文件和库文件:--extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib 

    这个问题原因我也不知道,大概就不是找不到libx264和libxvid安装的库文件路径,但是我是把他们安装在/usr/local目录下,查看/usr/local/lib目录也有它们相应的库文件,因为这个路径本身就是全局路径,按理说不是要特定的去再次指出他们的路径,但是没有这项参数就不会通过

 

问题三:make编译ffmpeg时,出现下面两类奇怪错误

                ffmpeg Warning: File /tests/fate/vp8.mak' has modification time或

               make: Warning: File `tests/fate/wma.mak' has modification time 3639293 s in the future

     这两类问题很相似,但是我没找到实质性解决问题的方法,原先我本来编译的是ffmpeg-0.8.14,后来就出现这样的问题,后来搞了很久没弄出来,就换成0.6.6的版本,结果没有出问题。

    其实我后来用ffmpeg-0.9.2,ffmpeg-1.0.4都没出现问题(x264用的是x264-snapshot-20130301-2245-stable),不过编译ffmpeg-1.1.3时又出现这样的问题,估计还是库的问题,所以没有得到实质性的解决,只有通过换ffmpeg的版本。x264的版本尽量用高版本,因为ffmpeg对x264的版本有要求,好像是要求x264的版本不小于某个版本,所以版本尽量高点更有保障。

 

    当然还有其他的一些常识性的问题,这里我没有细说,也可能没有记下。


你可能感兴趣的:(嵌入式)