1 编译安装FFmpeg+libx264

1.1 安装yasm或者nasm

libx264需要yasm或者nasm进行编译,所以需要安装yasm或者nasm的对应版本,一般是nasm 2.13。

安装yasm

sudo apt-get install yasm

安装nasm

sudo apt-get install nasm

1.2 安装pkg-config

如果未安装pkg-config时,在使用ffmpeg的编译文件./configure编译ffmpge时会出现

WARNING: pkg-config not found, library detection may fail.
WARNING: using libx264 without pkg-config

警告,这个时候需要使用

sudo apt install pkg-config

安装pkg-config,重新编译ffmpeg即可消除这个警告。

至于pkg-config的作用就是为了返回已安装库的头文件,库文件等信息,方便其他库依赖当前库时可以很快的找到这个库。比如后续在OpenCV中使用读取视频cv::VideoCapture就需要依赖ffmpeg的库,而OpenCV的库寻找就是通过pkg-config的方式寻找ffmpeg库。

具体的pkg-config的作用可参考:

1.3 编译安装libx264

使用以下命令编译安装libx264

git clone http://git.videolan.org/git/x264.git
cd x264/
./configure --enable-shared
make
sudo make install

安装之后include路径为

/usr/local/include

安装之后的lib路径为

/usr/local/lib

安装后pkgconfig路径为

/usr/local/lib/pkgconfig

将x264 pkgconfig文件到系统的目录下

sudo cp /usr/local/lib/pkgconfig/x264.pc  /usr/lib/pkgconfig

或者

sudo cp /usr/local/lib/pkgconfig/x264.pc  /usr/share/pkgconfig

或者修改系统环境变量(推荐方式),之后的ffmpeg或者opencv的pkg文件也安装到目录/usr/local/lib/pkgconfig下,通过这种方式就可以实现pkg的集中管理

vim /etc/profile

#增加下面的行
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

# 生效
source /etc/profile

配置x264动态库环境

nano /etc/ld.so.conf.d/x264.conf
在文件中添加一行:/usr/local/lib

# 生效
sudo ldconfig

1.4 ffmpeg编译安装

1.4.1 下载ffmpeg

在官网下载ffmpge,下载地址为:http://ffmpeg.org/download.html#releases

从这个链接获取更老的版本:http://ffmpeg.org/olddownload.html
或者用这个链接:http://ffmpeg.org/releases/

往下拉,找到自己需要的ffmpeg版本,这里以ffmpge4.4.1版本为例

Ubuntu编译安装FFmpeg+libx264以及编译+安装Opencv+FFmpeg保姆教程-StubbornHuang Blog

如果是命令行直接使用

wget -c http://ffmpeg.org/releases/ffmpeg-4.4.1.tar.gz

下载到本地。

或者可以从这个网站获取ffmpeg所有版本的下载链接:https://www.johnvansickle.com/ffmpeg/old-releases/

Ubuntu编译安装FFmpeg+libx264以及编译+安装Opencv+FFmpeg保姆教程-StubbornHuang Blog

1.4.2 解压缩

tar xvf ffmpeg-4.4.1.tar.gz

1.4.3 编译安装

ffmpeg的编译工具./configure的详细参数请参考:https://www.stubbornhuang.com/2053/

在解压缩的目录下使用以下命令编译ffmpeg

./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-libx264 --enable-gpl --pkgconfigdir=/usr/local/lib/pkgconfig
make
sudo make install

根据编译工具./configure的详细参数,以上命令的意义为设置ffmpeg的安装路径为/usr/local/ffmpeg,构建ffmpge动态库,不构建ffmpeg静态库,不生成ffmpeg文档,启用x264编解码。另外这里设置了参数--pkgconfigdir,在安装的时候将ffmpeg的pkgconfig的相关文件拷贝到路径/usr/share/pkgconfig,设置这个参数的目的主要是为了在后续编译OpenCV+ffmpeg的时候可以找到ffmpge库的相关信息。这里可参考:https://www.cnblogs.com/haiyang21/p/11029303.html

可以使用

configure --help

查看configure的可使用参数的含义,下面列举几个经常用到的:

  • --prefix:ffmpeg的安装目录,默认为/usr/local
  • --bindir:二进制安装目录,默认为prefix/bin
  • --libdir:静态库安装目录,默认为prefix/lib
  • --shlibdir:动态库安装目录,默认为系统的动态库目录,也就是LIBDIR变量
  • --pkgconfigdir:pkg文件安装目录,默认为LIBDIR/lib,pkg 是用来给第三方软件找到 FFmpeg 静态库,动态库,比如opencv
  • --disable-static,--enable-shared,这两个选项分别是 禁止生成静态库 跟 生成动态库。FFmpeg 默认会生成静态库,但是他不能同时生成静态库跟动态库,如果你启动了 --enable-shared,那就只会生成动态库,不会生成静态库。如果你需要同时用到静态库跟动态库,那就需要编译两次
  • --enable-small:把 FFmpeg 的体积减少
  • --disable-programs:不生成 ffmpeg.exe ,ffplay.exe ,ffprobe.exe 可执行文件。只生成静态库或者动态库。也可以单独指定某个 exe 不生成,例如 --disable-ffplay
  • --disable-doc:不编译生成文档,可以节省编译时间

部分选项可看下面的截图:

Ubuntu编译安装FFmpeg+libx264以及编译+安装Opencv+FFmpeg保姆教程-StubbornHuang Blog

1.4.4 配置ffmpeg环境变量

配置ffmpeg动态库路径

sudo nano /etc/ld.so.conf.d/ffmpeg.conf
在ffmpeg.conf文件中添加一行:/usr/local/ffmpeg/lib

# 生效
sudo ldconfig

配置ffmpeg系统环境变量

sudo nano /etc/profile

# 在该文件中增加:
export FFMPEG_HOME=/usr/local/ffmpeg/bin
export PATH=$PATH:$FFMPEG_HOME

# 生效
source /etc/profile

拷贝ffmpge pkgconfig文件到系统的目录下

sudo cp /usr/local/ffmpeg/lib/pkgconfig/*  /usr/share/pkgconfig

或者

sudo cp /usr/local/ffmpeg/lib/pkgconfig/*  /usr/lib/pkgconfig

都可以。

不过还是推荐使用修改环境变量的方式。

1.4.5 测试ffmpeg是否安装成功

使用

ffmpge -version

如果可以正确打印出信息,则说明ffmpeg安装成功。

或者使用进行检查

pkg-config --modversion libavcodec
pkg-config --modversion libavdevice
pkg-config --modversion libavfilter
pkg-config --modversion libavformat
pkg-config --modversion libavutil
pkg-config --modversion libpostproc
pkg-config --modversion libswresample
pkg-config --modversion libswscale

2 编译安装Opencv+FFmpeg

2.1 下载OpenCV

官网下载地址:https://opencv.org/releases/

这里以OpenCV3.4.10为例

Ubuntu编译安装FFmpeg+libx264以及编译+安装Opencv+FFmpeg保姆教程-StubbornHuang Blog

如果是命令行则使用

wget -c https://github.com/opencv/opencv/archive/3.4.10.zip

将源码下载到本地。

2.2 编译OpenCV

2.2.1 解压缩

unzip ./3.4.10.zip

2.2.2 编译OpenCV

解压缩完成之后,使用以下命令

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv -D WITH_FFMPEG=ON -D BUILD_EXAMPLES=OFF -D BUILD_DOCS=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D WITH_TBB=ON -D WITH_OPENMP=ON -D WITH_EIGEN=ON -D OPENCV_GENERATE_PKGCONFIG=ON ..
make
sudo make install

在解压缩文件夹下创建文件夹build,进入新建的build文件夹下,使用cmake命令编译。
上述的cmake命令中参数意义为:

  • CMAKE_BUILD_TYPE=RELEASE:设置编译模式为Release
  • CMAKE_INSTALL_PREFIX=/usr/local/opencv:指定安装路径为/usr/local/opencv
  • WITH_FFMPEG=ON:启用ffmpeg混编
  • BUILD_EXAMPLES=OFF:不生成例子
  • BUILD_DOCS=OFF:不生成文档
  • BUILD_TESTS=OFF:不生成测试用例
  • WITH_TBB=ON:启用TBB
  • WITH_OPENMP=ON:启用OpenMP
  • WITH_EIGEN=ON:启用Eigen
  • OPENCV_GENERATE_PKGCONFIG=ON:生成pkg文件

安装完成之后的include的路径为:

/usr/local/opencv/include

lib路径为:

/usr/local/opencv/lib

2.2.3 OpenCV编译时找不到ffmpeg

如果前面ffmpeg没有安装成功、动态库没配置、环境变量没配置、以及pkgconfig拷贝到指定的系统目录,在进行opencv+ffmpge混编时,使用cmake生成makefiles文件时会出现如下ffmpeg库没有被找到的问题

--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      NO
--       avcodec:                   NO
--       avformat:                  NO
--       avutil:                    NO
--       swscale:                   NO
--       avresample:                NO
--     GStreamer:                   NO
--     libv4l/libv4l2:              NO
--     v4l/v4l2:                    linux/videodev2.h

默认pkg-config只会在/usr/share/pkgconfig/、/usr/lib/pkgconfig/ 、/usr/lib64/pkgconfig/目录下寻找*.pc文件,如果这个时候出现找不到ffmpeg的情况就是没有找到ffmpge相关的所有pc文件,所以最好的方式还是1.3节中的方式,修改PKG_CONFIG_PATH环境变量,将ffmpge的pkg文件所在目录增加到该环境变量中,比如

vim /etc/profile

#增加下面的行
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

# 生效
source /etc/profile

第1.4.3节中配置ffmpeg的configure时指定了--pkgconfigdir=/usr/local/lib/pkgconfig,所以就将这个文件路径增加到PKG_CONFIG_PATH环境变量即可。

设置完成之后,重新cmake即可,如果看到

--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      Yes
--       avcodec:                   Yes
--       avformat:                  Yes
--       avutil:                    Yes
--       swscale:                   Yes
--       avresample:                Yes
--     GStreamer:                   NO
--     libv4l/libv4l2:              NO
--     v4l/v4l2:                    linux/videodev2.h

则说明成功找到了ffmpeg,即可使用make进行编译。

2.2.4 配置opencv环境变量

配置opencv动态库路径

sudo nano /etc/ld.so.conf.d/opencv.conf
在opencv.conf文件中添加一行:/usr/local/opencv/lib

# 生效
sudo ldconfig

拷贝opencv pkgconfig文件到系统的目录下

这个路径不同也是看安装时opencv.pc所在的路径是哪一个,下面两种情况我都遇到过。

sudo cp /usr/local/opencv/lib/pkgconfig/opencv.pc /usr/share/pkgconfig/
sudo cp /usr/local/opencv/lib/pkgconfig/opencv4.pc /usr/share/pkgconfig/

或者

sudo cp /usr/local/opencv/lib/pkgconfig/opencv.pc /usr/lib/pkgconfig/
sudo cp /usr/local/opencv/lib/pkgconfig/opencv4.pc /usr/lib/pkgconfig/

或者拷贝到/usr/local/lib/pkgconfig,因为前面配置了PKG_CONFIG_PATH环境变量。

2.2.5 测试opencv是否安装成功

pkg-config --modversion opencv*

参考链接