notebook/CentOS7CompileOpencvFFmpeg.md

136 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 编译FFmpeg
省略下载或同步源代码步骤,需要的源代码内容见[FFmpeg官方编译Wiki](https://trac.ffmpeg.org/wiki/CompilationGuide) 。为了后面编译动态库,编译时需要加上`-fPIC`参数。
## 编译需要的容器
```commandline
docker run -it -d --privileged=true --name centos7 -p 2333:22 centos:7 /usr/sbin/init
docker exec -it centos7 bash
```
## 编译
```shell
# 编译需要的环境
yum install autoconf automake bzip2 bzip2-devel freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel
# 解压源码
tar xzvf ffmpeg_sources.tar.gz
cd ~/ffmpeg_sources
# 解压
tar xjvf nasm-2.15.05.tar.bz2
tar xzvf yasm-1.3.0.tar.gz
tar xzvf lame-3.100.tar.gz
tar xzvf opus-1.3.1.tar.gz
tar zxvf libvpx.tar.gz -m # -m 强制时间同步
tar zxvf ffmpeg-4.4.tar.gz
tar zxvf x264-stable.tar.gz
mv x264-stable x264
tar zxvf x265_git.tar.gz
tar zxvf fdk-aac.tar.gz
# 安装cmake
./cmake-3.21.3-linux-x86_64.sh --prefix=/usr/local
mv /usr/local/cmake-3.21.3-linux-x86_64 /usr/local/cmake
# 添加编译需要的环境变量
echo "export PATH=\$PATH:/usr/local/cmake/bin" >> ~/.bashrc
echo "export PATH=\$HOME/bin:\$PATH" >> ~/.bashrc
echo "export PKG_CONFIG_PATH=\$HOME/ffmpeg_build/lib/pkgconfig:\$PKG_CONFIG_PATH" >> ~/.bashrc
source ~/.bashrc
# 编译nasm
cd ~/ffmpeg_sources/nasm-2.15.05
./autogen.sh
CFLAGS=-fPIC CPPFLAGS=-fPIC ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make -j6 && make install
# 编译yasm
cd ~/ffmpeg_sources/yasm-1.3.0
CFLAGS=-fPIC CPPFLAGS=-fPIC ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make -j6 && make install
# 编译x264
cd ~/ffmpeg_sources/x264
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --extra-cflags=-fPIC
make -j6 && make install
# 编译x265
cd ~/ffmpeg_sources/x265_git/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off -DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC ../../source
make -j6 && make install
# 编译fdk-aac
cd ~/ffmpeg_sources/fdk-aac
autoreconf -fiv
CFLAGS=-fPIC CPPFLAGS=-fPIC ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make -j6 && make install
# 编译lame
cd ~/ffmpeg_sources/lame-3.100
CFLAGS=-fPIC CPPFLAGS=-fPIC ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
make -j6 && make install
# 编译opus
cd ~/ffmpeg_sources/opus-1.3.1
CFLAGS=-fPIC CPPFLAGS=-fPIC ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make -j6 && make install
# 编译vpx
cd ~/ffmpeg_sources/libvpx
./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --extra-cflags=-fPIC --extra-cxxflags=-fPIC
make -j6 && make install
# 编译ffmpeg
cd ~/ffmpeg_sources/ffmpeg-4.4
./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include -fPIC" \
--extra-cxxflags="-fPIC" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs=-lpthread \
--extra-libs=-lm \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-libfdk_aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree \
--enable-shared
make -j6 && make install
```
如果`./configure`时去掉`--enable-shared`参数将会编译静态库。但使用FFmpeg编译的静态库的时候需要注意**链接动态库**时要加上`-Wl,-Bsymbolic`选项,这个参数告诉链接器遇到重名符号时优先链接本地符号[^1]。否则将会出现错误:
```text
libavcodec.a(vc1dsp_mmx.o): relocation R_X86_64_PC32 against symbol `ff_pw_9' can not be used when making a shared object; recompile with -fPIC
```
# 编译OpenCV[^2]
```shell
yum install wget unzip
wget https://github.com/opencv/opencv/archive/4.5.3.zip
wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.3.zip -O 4.5.3_contrib.zip
unzip 4.5.3.zip
unzip 4.5.3_contrib.zip
cp -frap opencv_contrib-4.5.3/ opencv-4.5.3/
cd opencv-4.5.3/
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_FFMPEG=ON -DCMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic ../
make -j6 && make install
```
OpenCV 4.5.3 的FFmpeg的视频模块需要修改一处源代码将OpenCV源码目录下的`modules/videoio/src/cap_ffmpeg_hw.hpp`文件939行`s_stream_ = std::istringstream(accel_list);`修改为`s_stream_.str(accel_list);`。
[^1]: 编译安装ffmpeg+OpenCV的时候的注意点 https://www.licc.tech/article?id=78
[^2]: Installation in Linux https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html