Ubuntu下FFmpeg的编译和优化

来源:互联网 发布:看电影便宜的软件 编辑:程序博客网 时间:2024/05/20 07:37

如需转载请注明出处!

最近项目需要,对ffmpeg进行了初步研究及本地开发。下面对开发过程进行简单总结,并列出过程中遇到的问题和解决。

软件环境:
Ubuntu 14.04 LTS
FFmpeg official source code


一. 安装SDL。 SDL 是开源多媒开发库,主要应用于图像和视频显示。对于音频开发,安装此选项的目的则是通过SDL生成ffplay应用程序,方便验证对音频文件解码播放功能。

sudo apt-get install libsdl1.2-dev
sudo apt-get install libsdl-image1.2-dev
sudo apt-get install libsdl-mixer1.2-dev
sudo apt-get install libsdl-ttf2.0-dev
sudo apt-get install gfx1.2-dev

二. 安装yasm。 yasm主要是对汇编编译环境进行了优化,应用于汇编编码。
1. 下载yasm源码, http://yasm.tortall.net/

2. 解压源码,进入目录后执行:
    ./configure
    make -j8

    sudo make install


三. 安装ffmpeg其他依赖库。
    sudo apt-get update
    sudo apt-get install build-essential subversion vim git git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libsdl1.2-dev                 
libtheora-dev libx11-dev libxvidcore4-dev zlib1g-dev automake1.9


四. 下载并编译ffmpeg
     1. 下载ffmpeg源码并解压
          git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg

      2. 进入ffmpeg目录
          首先对编译进行配置

      ./configure --enable-gpl --enable-libmp3lame --enable-libxvid --enable-libfaac --enable-nonfree --enable-shared --enable-static --                              prefix=/usr/local/ffmpeg​

      这里指定ffmpeg安装目录为/usr/local/ffmpeg,如果不指定的话编译结果将生成在/usr/local/bin  /usr/local/lib  /usr/local/include  /usr/local/share.

另外,由于采用了第三方的编解码器(mp3lame, libfaac等),所以配置选项要增添gpl 和 nonfree选项。--enable-shared用于生成动态库,--enable-static用于生成静态库。后续的编程中,多采用动态库方案。

      ./configure完成之后,就开始对ffmpeg源码进行编译了。
       make -j8
       sudo make install

      编译完成之后,在/usr/local/ffmpeg/目录下会生成四个文件夹:bin(包含可执行文件ffplay ffserver ffprobe ffmpeg)、include(各模块所需的头文件,libavcodec、libavformat等)、lib(各动态库和静态库文件,libavcodec.so libavformat.so等)、share

      通过使用bin目录下的ffplay可执行程序,可以测试当前编译结果的编解码功能,例如ffplay test.aac。

注意:此时直接执行ffplay test.aac 系统会报错:找不到动态库libavdevice.so等

这是因为ffplay在播放音频文件时,需要liavdevice.so等动态库文件的支持,其只在/usr/lib 或 /lib目录下搜寻所需的库。所以在执行ffplay之前,需要将/usr/local/ffmpeg/lib中的文件拷贝到/usr/lib下。同时,为了以后方便编程,将/usr/local/ffmpeg/include下的文件拷贝到/usr/include下.

另外,还有一个方法能能使不拷贝/usr/local/ffmpeg/lib的情况下,保证程序正确运行:
echo "/usr/local/ffmpeg/lib" >> /etc/ld.so.conf
sudo ldconfig

/etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so库的路径。

默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,而通常通过源码包进行安装时,如果不指定--prefix会将库安装在/usr/local目录下,而又没有在文件/etc/ld.so.conf中添加/usr/local/lib这个目录。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。

执行ldconfig的作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新的搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。



针对实际工程需要,我们在使用ffmpeg时,可能只是用到特定一种或几种编解码格式,因此需要对ffmpeg进行精简。尽可能的压缩ffmpeg生成库大小,这是可通过ffmpeg的configure选项进行优化。

./configure --help

列出比较多的配置选项,包含encoder, decoder, muxer, demuxer, parser等选项,根据需要做不同选择即可。






0 0
原创粉丝点击