业务需要,需要在Linux系统下编译带x264编码的ffmpeg工程,略踩小坑,过程记录如下。
首先下载源码,
ffmpeg: http://www.ffmpeg.org/download.html
x264:http://download.videolan.org/x264/snapshots/
yasm:http://yasm.tortall.net/Download.html
yasm是x86架构下的一个汇编器,ffmpeg默认是使能的。没有该汇编器的话,后面编译ffmpeg时会报如下错误:
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
因此,我们首先来编译yasm。
进入yasm的source目录,依次执行下列语句:
./configure --prefix=/usr/local/ffmpeg_build/yasm
make
sudo make install
首先进入x264的source目录,配置如下:
./configure --prefix=/usr/local/ffmpeg_build/x264 --enable-shared --enable-static
然后:
make
sudo make install
首先需要在配置中指明依赖的外部头文件和外部库的位置,配置如下:
./configure --prefix=/usr/local/ffmpeg_build/ffmpeg \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--enable-pthreads \
--enable-libx264 \
--enable-shared \
--extra-cflags=-I/usr/local/ffmpeg_build/x264/include \
--extra-ldflags=-L/usr/local/ffmpeg_build/x264/lib
执行以上命令时报如下错误:
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
咦,命名安装了yasm库,怎么还报错?这是因为我们把yasm库手动安装到了 /usr/local/ffmpeg_build/yasm下面,并不在配置程序的搜索范围内,因此我们需要用如下语句将yasm的路径导出:
export PATH=$PATH:/usr/local/ffmpeg_build/yasm/bin
该命令将路径/usr/local/ffmpeg_build/yasm/bin放入环境变量中,但该设置是临时的,如果想让该环境变量永久有效,可以通过修改/etc/profile文件达成:
sudo vi /etc/profile
在下面加入:
export PATH="$PATH:/usr/local/ffmpeg_build/yasm/bin"
然后执行如下命令使环境变量立即生效:
source /etc/profile
通过以上操作后,我们再来执行ffmpeg的配置语句,执行通过。
然后make & sudo make install完成安装。
做个简单的转码测试,命令行如下:
./ffmpeg -i littlegirl.mp4 -c:v libx264 -c:a copy -f mpegts littlegirl.ts
报错:
./ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory.
提示找不到libavdevice.so。
解决方法:将我们的动态库路径加入到/etc/ld.so.conf中,操作如下:
sudo vi /etc/ld.so.conf
在下面加入我们的动态库安装的路径:
/usr/local/ffmpeg_build/ffmpeg/lib
/usr/local/ffmpeg_build/x264/lib
然后执行 sudo ldconfig
进行上面的操作后,再次执行上面的转码命令,OK。
以上过程说明了如何在手动指定外部头文件和库文件位置的情况下的设置,其实可以更简单,将所有依赖的头文件放在/usr/local/include目录,所有库文件放在/usr/local/lib目录,可执行文件放在/usr/local/bin目录,由于这些目录默认在系统环境变量中,因此编译的时候能省去不少麻烦。