diff --git a/CentOS7CompileOpencvFFmpeg.md b/CentOS7CompileOpencvFFmpeg.md index 100597b..b8cedab 100644 --- a/CentOS7CompileOpencvFFmpeg.md +++ b/CentOS7CompileOpencvFFmpeg.md @@ -1,6 +1,6 @@ -# 编译ffmpeg +# 编译FFmpeg -省略下载步骤,下载内容见[FFmpeg官方编译Wiki](https://trac.ffmpeg.org/wiki/CompilationGuide) +省略下载或同步源代码步骤,需要的源代码内容见[FFmpeg官方编译Wiki](https://trac.ffmpeg.org/wiki/CompilationGuide) 。为了后面编译动态库,编译时需要加上`-fPIC`参数。 ## 编译需要的容器 @@ -9,6 +9,8 @@ docker run -it -d --privileged=true --name centos7 -p 2333:22 centos:7 /usr/sbin docker exec -it centos7 bash ``` +## 编译 + ```shell # 编译需要的环境 yum install autoconf automake bzip2 bzip2-devel freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel @@ -17,22 +19,26 @@ yum install autoconf automake bzip2 bzip2-devel freetype-devel gcc gcc-c++ git l 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 +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 ./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 @@ -48,7 +54,7 @@ make -j6 && make install # 编译x264 cd ~/ffmpeg_sources/x264 -PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --extra-cflags=-fPIC +./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --extra-cflags=-fPIC make -j6 && make install # 编译x265 @@ -79,7 +85,7 @@ make -j6 && make install # 编译ffmpeg cd ~/ffmpeg_sources/ffmpeg-4.4 -PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \ +./configure \ --prefix="$HOME/ffmpeg_build" \ --pkg-config-flags="--static" \ --extra-cflags="-I$HOME/ffmpeg_build/include -fPIC" \ @@ -100,13 +106,30 @@ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./conf --enable-shared make -j6 && make install ``` ---enable-shared \ -# 编译opencv[^1] + +如果`./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 -PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_FFMPEG=ON -DCMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic ../ +cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_FFMPEG=ON -DCMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic ../ make -j6 && make install ``` -[^1]: Installation in Linux https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html \ No newline at end of file +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