2. 开发环境搭建:FFmpeg编译与安装、OpenCV环境配置、Python虚拟环境与依赖管理
好,咱们正式开始动手了。这一章我带你搭环境。别小看这一步,我见过太多人卡在环境上,代码写好了跑不起来,最后发现是FFmpeg版本不对,或者OpenCV没编译GPU模块。嗯,咱们一次搞定。
2.1 FFmpeg:从源码编译到安装
FFmpeg是视频处理的核心。说白了,没有它,你连视频流都打不开。我个人习惯用源码编译,而不是直接apt-get或brew安装。为什么?因为编译出来的版本你可以定制模块,比如加上硬件加速、特定编码器。
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的编码器,就说明成功了。
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_FFMPEG和WITH_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,就说明环境搭好了。
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就能装好所有依赖。
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__)
如果没报错,恭喜你,环境搭好了。
2.4 总结
这一章我们做了三件事:编译FFmpeg、编译OpenCV、搭建Python虚拟环境。看起来步骤多,但每一步都是必要的。你想想看,如果FFmpeg没装好,后面视频流解码全得抓瞎。如果OpenCV没带FFmpeg支持,你连视频文件都读不了。
我个人建议,把编译好的FFmpeg和OpenCV的路径记下来,以后重装系统或者换机器,直接复用。我一般会把编译好的二进制文件打包,放到NAS上,换机器时直接解压,省得重新编译。
下一章,咱们开始写第一个视频流读取程序。到时候你会发现,今天搭的环境,全都能用上。