Ubuntu 环境编译FFmpeg

  • Post author:
  • Post category:其他


安装依赖库

安装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文件。这在配置的时候很重要。