2. 开发环境搭建:FFmpeg编译与安装、OpenCV环境配置、Python虚拟环境与依赖管理

好,咱们正式开始动手了。这一章我带你搭环境。别小看这一步,我见过太多人卡在环境上,代码写好了跑不起来,最后发现是FFmpeg版本不对,或者OpenCV没编译GPU模块。嗯,咱们一次搞定。

2.1 FFmpeg:从源码编译到安装

FFmpeg是视频处理的核心。说白了,没有它,你连视频流都打不开。我个人习惯用源码编译,而不是直接apt-get或brew安装。为什么?因为编译出来的版本你可以定制模块,比如加上硬件加速、特定编码器。

注意: 千万不要用系统自带的FFmpeg,版本太老,很多新特性不支持。我曾经在项目里因为用了旧版FFmpeg,结果H.265的流死活解不出来,折腾了两天才发现是版本问题。

2.1.1 下载源码

去官网或者GitHub拉取最新稳定版。我建议用git clone,方便后续更新。

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg

2.1.2 配置编译选项

这一步是关键。你需要根据自己的需求开启或关闭模块。比如我们要做安防视频流处理,H.264和H.265是必须的,还有硬件加速(NVIDIA CUDA或Intel QSV)。

./configure --enable-gpl --enable-nonfree \
            --enable-libx264 --enable-libx265 \
            --enable-cuda --enable-cuvid \
            --enable-nvenc --enable-ffnvcodec \
            --prefix=/usr/local/ffmpeg

你想想看,如果不加--enable-libx264,你连最基础的H.264编码都用不了。我在项目中遇到过,客户给的摄像头只输出H.265,结果我编译时没开libx265,当场傻眼。

2.1.3 编译与安装

make -j$(nproc)
sudo make install

-j$(nproc) 是用所有CPU核心并行编译,速度能快不少。编译大概需要10-20分钟,喝杯咖啡吧。

2.1.4 验证安装

ffmpeg -version
ffmpeg -encoders | grep h264

看到输出里有h264和h265的编码器,就说明成功了。

小技巧: 把FFmpeg的bin目录加到PATH里,这样全局都能调用。我习惯在~/.bashrc里加一行:export PATH=/usr/local/ffmpeg/bin:$PATH

2.2 OpenCV环境配置

OpenCV是咱们处理图像的主力。安防场景里,人脸检测、运动检测、图像增强,全靠它。我建议编译OpenCV时也带上FFmpeg支持,这样可以直接用OpenCV读取视频流。

2.2.1 安装依赖

先把基础库装上,不然编译会报一堆错。

sudo apt-get update
sudo apt-get install build-essential cmake git pkg-config \
                     libjpeg-dev libtiff-dev libpng-dev \
                     libavcodec-dev libavformat-dev libswscale-dev \
                     libv4l-dev libxvidcore-dev libx264-dev

2.2.2 下载OpenCV源码

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

opencv_contrib里有很多扩展模块,比如人脸识别、文本检测,建议一起编译。

2.2.3 CMake配置

这里要注意,一定要开启WITH_FFMPEGWITH_CUDA(如果你有NVIDIA显卡)。

cd opencv
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D WITH_FFMPEG=ON \
      -D WITH_CUDA=ON \
      -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
      ..

CMake输出里会显示FFmpeg是否找到。如果显示FFMPEG: NO,那说明你的FFmpeg没装好,或者路径不对。我曾经踩过这个坑,折腾了半天才发现是pkg-config没配置好。

2.2.4 编译与安装

make -j$(nproc)
sudo make install

编译OpenCV比FFmpeg慢,大概30分钟到1小时。你可以去干点别的。

2.2.5 验证OpenCV

python3 -c "import cv2; print(cv2.getBuildInformation())"

看到FFmpeg和CUDA都显示YES,就说明环境搭好了。

重要: 如果你用的是Python,记得安装OpenCV的Python包:pip install opencv-python。但注意,pip安装的是预编译版本,可能不带FFmpeg和CUDA支持。我建议用自己编译的版本,然后通过PYTHONPATH指向编译好的cv2.so。

2.3 Python虚拟环境与依赖管理

Python环境管理,说白了就是隔离。每个项目用独立的虚拟环境,避免依赖冲突。我见过有人把所有项目都装在全局环境里,结果一个项目要TensorFlow 1.x,另一个要2.x,直接炸了。

2.3.1 创建虚拟环境

我推荐用venv,Python3自带,轻量好用。

python3 -m venv security_cam_env
source security_cam_env/bin/activate

激活后,终端前面会出现(security_cam_env),说明你已经在虚拟环境里了。

2.3.2 安装核心依赖

咱们这个课程需要以下库:

库名 用途 安装命令
opencv-python 图像处理、视频读取 pip install opencv-python
numpy 矩阵运算、图像数据操作 pip install numpy
imutils 图像处理工具函数 pip install imutils
flask 视频流Web服务 pip install flask
redis 视频帧缓存 pip install redis
pip install opencv-python numpy imutils flask redis

2.3.3 管理依赖版本

我习惯把依赖写进requirements.txt,方便别人复现环境。

pip freeze > requirements.txt

以后别人拿到项目,直接pip install -r requirements.txt就能装好所有依赖。

小技巧: 如果你用自己编译的OpenCV,不要用pip安装opencv-python,否则会覆盖你的编译版本。正确的做法是:在虚拟环境里,把编译好的cv2.so复制到site-packages目录下。

2.3.4 验证环境

写个简单的测试脚本,确保所有库都能正常导入。

import cv2
import numpy as np
import flask
import redis

print("OpenCV version:", cv2.__version__)
print("NumPy version:", np.__version__)
print("Flask version:", flask.__version__)
print("Redis version:", redis.__version__)

如果没报错,恭喜你,环境搭好了。

注意: 如果你在Windows上开发,建议用WSL2或者Docker。Windows原生编译FFmpeg和OpenCV比较麻烦,我当年在Windows上折腾了三天才搞定,后来换了WSL2,半小时就搞定了。

2.4 总结

这一章我们做了三件事:编译FFmpeg、编译OpenCV、搭建Python虚拟环境。看起来步骤多,但每一步都是必要的。你想想看,如果FFmpeg没装好,后面视频流解码全得抓瞎。如果OpenCV没带FFmpeg支持,你连视频文件都读不了。

我个人建议,把编译好的FFmpeg和OpenCV的路径记下来,以后重装系统或者换机器,直接复用。我一般会把编译好的二进制文件打包,放到NAS上,换机器时直接解压,省得重新编译。

下一章,咱们开始写第一个视频流读取程序。到时候你会发现,今天搭的环境,全都能用上。