Ubuntu下FFmpeg的编译和优化
2015-01-13 16:59
218 查看
如需转载请注明出处!
最近项目需要,对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等选项,根据需要做不同选择即可。
最近项目需要,对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等选项,根据需要做不同选择即可。
相关文章推荐
- ubuntu 10.04 编译ffmpeg
- 在 Ubuntu 下使用 Android NDK r4b 编译 FFmpeg 0.6.3
- Ubuntu 11.04下编译最新ffmpeg
- ubuntu中使用android ndk编译ffmpeg.
- FFMpeg 源码编译 在ubuntu
- vm+ubuntu+ffmpeg编译
- 在 Ubuntu 下使用 Android NDK r4b 编译 FFmpeg 0.6.3
- ubuntu10.4下编译ffmpeg教程---tutorial05.c
- 在 Ubuntu 下使用 Android NDK r4b 编译 FFmpeg 0.6.3
- 在 Ubuntu 下使用 Android NDK r4b 编译 FFmpeg 0.6.3
- 【zz】Ubuntu10.04编译FFmpeg
- 在Ubuntu中用Android NDK编译FFmpeg
- 在Ubuntu中用Android NDK编译FFmpeg
- 在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg0.8.1版-Android中使用FFmpeg媒体库(一)
- 在Ubuntu中用Android NDK编译FFmpeg(已经验证没有任何问题!2011.06.1)
- Ubuntu10.04编译FFmpeg
- 在Ubuntu中用Android NDK编译FFmpeg
- 在Ubuntu中用Android NDK编译FFmpeg
- 在 Ubuntu 下使用 Android NDK r4b 编译 FFmpeg 0.6.3
- 在 Ubuntu 下使用 Android NDK r4b 编译 FFmpeg 0.6.3