本文描述在linux下,怎么分别通过直接下载二进制文件,以及自行源码编译这两种方式安装ffmpeg。
安装时遇到的某些问题和错误会扩展开来说明,授之以渔。
ffmpeg现在提供了静态编译版本的二进制可执行文件,可以直接下载下来使用。
包含的文件有ffmpeg和ffprobe,不包含libav*
等ffmpeg的库。
这种安装方式比较实用于直接使用ffmpeg命令行工具的场景。
访问 https://johnvansickle.com/ffmpeg/ 这个网页,获取最新稳定版本:
(这个网页即包含了最新稳定版本,也包含了git master上的最新版本。个人觉得用稳定版本比较好,稳定些。)
写这篇文章时,最新稳定版本是:release: 4.2.2
普通的linux服务器,下载这个文件:ffmpeg-release-i686-static.tar.xz
二进制文件的信息可以访问 https://johnvansickle.com/ffmpeg/release-readme.txt 这个网页获取,罗列的还是比较详细的。
以下是安装过程,简单概况就两步,下载,解压,使用:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 下载压缩包 $wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-i686-static.tar.xz # 下载对应的md5文件 $wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-i686-static.tar.xz.md5 # 验证压缩包的md5是否正确,防止文件损坏 $md5sum -c ffmpeg-release-i686-static.tar.xz.md5 # 解压 $tar xvf ffmpeg-release-i686-static.tar.xz # 运行 $./ffmpeg-4.2.2-i686-static/ffmpeg # 如果没问题,可以将ffmpeg拷贝至系统bin目录下 $mv ffmpeg-4.2.2-i686-static/ffmpeg ffmpeg-4.2.2-i686-static/ffprobe /usr/local/bin/ |
FAQ 1. linux内核版本过低怎么办
比如我在一台测试机上,运行下载好的二进制ffmpeg,报错:
1 2 3 |
$./ffmpeg-4.2.2-i686-static/ffmpeg FATAL: kernel too old Aborted |
事实上, https://johnvansickle.com/ffmpeg/ 这个下载页面上也会注明当前编译好的ffmpeg二进制版本支持的linux内核最低版本,写这篇文章时,对应的是>= 3.2.0
。我们可以通过 https://pengrl.com/p/20026/ 这个页面描述的方法查看我的测试机的内核版本,为2.6.32
,确实低于要求的版本。
此时我们有两种选择,要么选择下载一个老版本的可执行文件,要么选择源码自行编译安装。
先说老版本。 https://www.johnvansickle.com/ffmpeg/old-releases/ 这个网页罗列了一些编译好的老版本,但是坑爹的是我没找到各版本对应的内核版本要求。于是我找了一个主版本号为3的试了试,对应的信息:
1 2 |
# 版本号,最后修改时间,大小 ffmpeg-3.3.4-64bit-static.tar.xz 2017-09-13 01:21 18M |
按上面的安装方式再来一遍:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$wget https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-3.3.4-64bit-static.tar.xz $wget https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-3.3.4-64bit-static.tar.xz.md5 $md5sum -c ffmpeg-3.3.4-64bit-static.tar.xz.md5 $tar xvf ffmpeg-3.3.4-64bit-static.tar.xz $./ffmpeg-3.3.4-64bit-static/ffmpeg ffmpeg version 3.3.4-static http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2017 the FFmpeg developers built with gcc 6.4.0 (Debian 6.4.0-4) 20170820 configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg libavutil 55. 58.100 / 55. 58.100 libavcodec 57. 89.100 / 57. 89.100 libavformat 57. 71.100 / 57. 71.100 libavdevice 57. 6.100 / 57. 6.100 libavfilter 6. 82.100 / 6. 82.100 libswscale 4. 6.100 / 4. 6.100 libswresample 2. 7.100 / 2. 7.100 libpostproc 54. 5.100 / 54. 5.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... |
可以看到,使用正常。
(如果不想看罗里吧嗦一大顿有用的话,可以跳到文章末尾直接拿写好的脚本用。。)
源码安装与二进制安装最大的不同是,你可以得到ffmpeg的libav*
的一系列库。如何你需要基于这些库做开发,那么基本上你只能源码安装。另外,假如你需要对ffmpeg的源码或者它依赖的第三方库的源码做定制化修改,那也需要源码安装。
我的环境是一台阿里云的云主机,系统是CentOS 6.5
,linux内核版本是2.6.32
,gcc版本是4.4.7 20120313 (Red Hat 4.4.7-23)
上 http://www.ffmpeg.org/download.html 这个网页找到最新稳定版本的ffmpeg源码下载:
1 2 3 4 |
$wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2 $tar xvf ffmpeg-4.2.2.tar.bz2 $cd ffmpeg-4.2.2 $./configure |
报错:
1 2 |
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build. ... |
yasm可以理解为是一个针对汇编做优化的库,所以我们选择先安装yasm而不是简单粗暴的使用--disable-x86asm
禁用它。
上 http://www.tortall.net/projects/yasm/releases/ 这个网页找yasm的源码下载:
1 2 3 4 5 6 |
$wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz $tar xvf yasm-1.3.0.tar.gz $cd yasm-1.3.0/ $./configure $make $make install |
成功之后,再回到ffmpeg的源码目录:
1 2 3 |
$cd ffmpeg-4.2.2 $./configure $make |
编译完后试试运行ffmpeg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$./ffmpeg ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-23) configuration: libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... |
但是需要注意的是,我们这样编译出来的ffmpeg,缺少很多编解码器,比如说h264。
这意味着,你用ffmpeg把一个h264编码的mp4文件转换成flv文件,不改动里面的编码数据,这是ok的,因为只是外层封装格式的转换,但是如果涉及到h264的编码和解码,可能就瞎了。这里例子就不上了。
那怎么添加需要的库呢,其实也很简单,基本就是两步,先源码安装好需要的编解码库,然后再在编译ffmpeg执行./configure
那一步时将库加上。
configure所有的参数说明可以通过./configure -h
查看。
我们回头看本文方式一中,直接运行下载得到的二进制ffmpeg,其中有一行信息:
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
这个就是这个ffmpeg当时./configure
的参数。可以看到里面包含了x264的库--enable-libx264
。
下面我们演示如何编译包含x264的ffmpeg。
首先,编译x264:
1 2 3 4 |
$wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2 $tar xvf x264-master.tar.bz2 $cd x264-master/ $./configure |
报错:
1 2 3 |
Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure with --disable-asm. |
安装nasm:
1 2 3 4 5 6 |
$wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz $tar xvf nasm-2.14.02.tar.gz $cd nasm-2.14.02/ $./configure $make $make install |
成功后,返回x264目录,继续编译:
1 2 3 4 5 6 |
$cd x264-master/ $./configure $make # 这里需要注意,默认的make install只会安装x264可执行文件,并不会安装静态库, # 所以我们使用install-lib-static $make install-lib-static |
回到ffmpeg源码目录,重新编译一个ffmpeg,这次我们把debug禁用掉,把x264包含上,显式指定编译静态库(不写的话默认也是静态库)
1 2 |
$./configure --disable-debug --enable-static --enable-libx264 |
报错:
1 |
libx264 is gpl and --enable-gpl is not specified. |
继续:
1 |
$./configure --disable-debug --enable-static --enable-libx264 --enable-gpl |
报错:
1 |
ERROR: libx264 not found |
打开ffbuild/config.log
文件查看错误信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/usr/local/lib/libx264.a(opencl-8.o): In function `x264_8_opencl_close_library': opencl.c:(.text+0x5dd): undefined reference to `dlclose' /usr/local/lib/libx264.a(opencl-8.o): In function `x264_8_opencl_load_library': opencl.c:(.text+0x62f): undefined reference to `dlopen' opencl.c:(.text+0x648): undefined reference to `dlsym' opencl.c:(.text+0x662): undefined reference to `dlsym' opencl.c:(.text+0x67c): undefined reference to `dlsym' opencl.c:(.text+0x696): undefined reference to `dlsym' opencl.c:(.text+0x6b0): undefined reference to `dlsym' /usr/local/lib/libx264.a(opencl-8.o):opencl.c:(.text+0x6ca): more undefined references to `dlsym' follow /usr/local/lib/libx264.a(opencl-8.o): In function `x264_8_opencl_load_library': opencl.c:(.text+0x934): undefined reference to `dlclose' /usr/local/lib/libx264.a(opencl-8.o): In function `x264_8_opencl_lookahead_init': opencl.c:(.text+0x170c): undefined reference to `dlopen' opencl.c:(.text+0x1727): undefined reference to `dlsym' opencl.c:(.text+0x173b): undefined reference to `dlsym' opencl.c:(.text+0x1752): undefined reference to `dlsym' opencl.c:(.text+0x1766): undefined reference to `dlsym' opencl.c:(.text+0x179c): undefined reference to `dlclose' collect2: ld returned 1 exit status |
把dl库加上:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$./configure --disable-debug --enable-static --enable-libx264 --enable-gpl --extra-libs=-ldl $make $./ffmpeg ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-23) configuration: --disable-debug --enable-libx264 --enable-gpl --extra-libs=-ldl libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Use -h to get full help or, even better, run 'man ffmpeg' |
说明安装成功了。
最后,提供一个我日后持续在本文维护的安装脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#!/usr/bin/env bash # 源码编译ffmpeg静态库以及可执行文件 # 需要root权限 # 本脚本的最新版本请访问 https://pengrl.com/p/20029/ set -x # 编译yasm,ffmpeg依赖的汇编优化的库 wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar xvf yasm-1.3.0.tar.gz cd yasm-1.3.0/ ./configure make make install cd - # 编译nasm,x264依赖的汇编优化的库 wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz tar xvf nasm-2.14.02.tar.gz cd nasm-2.14.02/ ./configure make make install cd - # 编译x264 wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2 tar xvf x264-master.tar.bz2 cd x264-master/ ./configure make make install-lib-static cd - # 编译ffmpeg wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2 tar xvf ffmpeg-4.2.2.tar.bz2 cd ffmpeg-4.2.2 ./configure --disable-debug --enable-static --enable-libx264 --enable-gpl --extra-libs=-ldl make make install ./ffmpeg |