安装依赖库
安装ffmpeg的依赖库:
sudo apt-get update
sudo apt-get install build-essential subversion Git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libsdl1.2-dev libtheora-dev libx11-dev libxvidcore4-dev zlib1g-dev
安装x264和yasm。
x264是非常流行的视频编解码工具,yasm则用于x264中汇编语言优化。在安装yasm时需要注意必须获取系统的root权限,方法是首先通过以下命令设置密码:
sudo passwd root
然后在进入root模式:
su root
禁用root模式:
sudo passwd -l root
yasm需要到官网上下载好源代码,解压后手动编译安装:
./configure
make
sudo make install
在编译过程中,大部分的代码都是通过这种方式编译的。
到官网下载X264的源代码,编译:
./configure –prefix=/usr –enable-shared //必须指定prefix位置,否则编译ffmpeg的时候会提示找不到libx264
make
sudo make install
安装SDL。
SDL是一个开源的多媒体开发库,可以设置图像和视频的绘制等操作。如果不安装SDL,FFMPEG将不能生成ffplay.exe播放器。在Ubuntu下安装SDL也很简单,只需要依次执行下列命令:
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
or
SDL版本:SDL2-2.0.3(下载)
http://www.libsdl.org/download-2.0.php
首先下载软件的源码包,建议将下载的源码包移动到/usr/local/src/目录下,并在这里解包
sudo mv xxx.tar.gz /usr/local/src 移动源码包 (可选项)
cd /usr/local/src 进入“/usr/local/src/”目录
sudo tar -xzvf xxx.tar.gz 解包源码
cd xxx 进入解包后的源码目录
源码目录中通常有一个configure脚本,用来配置即将开始的编译过程
sudo ./configure –prefix=/usr/
make
sudo make install
编译ffmpeg
下载ffmpeg。
mkdir ffmpeg
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
配置
./configure –enable-shared –disable-x86asm –prefix=/usr/local/ffmpeg
其中:–enable-shared 是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。–prefix设置的安装目录。
如果执行结果不对,可以根据提示信息,并查看帮助,解决问题
./configure –help
编译并安装
make
sudo make install
安装之后在/usr/local/ffmpeg会看到有三个目录
lib 动态链接库位置
include 编程要用到头文件
bin 执行文件所在的目录
lib中链接库
为了以后方便编程,我们把lib中的三个链接库libavcodec.so libavformat.so libavutil.so复制到/usr/lib下。把include目录下的ffmpeg目录复制到/usr/include下。
可以将/usr/local/ffmpeg/lib目录设置到LD_LIBRARY_PATH环境变量,
或者查看/usr/local/ffmpeg/lib下所有的链接,并在/usr/lib下建立同样的链接。如下。
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so.55
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so.55
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so.3
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so.55
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so.52
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so.0
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so.2
这里我这样复制了还是不对,-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即可。
编程
如果写了一个test.c文件,要包含ffmpeg的头文件,可以这样写:
#include<文件夹名/头文件名>
编译:gcc -o test test.c -lavformat -lavcodec -lavtuil (前提是有之前的操作)
如果没有,则编译的时候如下:
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文件。这在配置的时候很重要。