2、开发环境搭建:Ubuntu下GStreamer安装、OpenCV编译、Python绑定配置、验证Hello World管道
好,咱们直接进入正题。环境搭建这事儿,说简单也简单,说坑也多。我这些年帮团队搭过不下二十次开发环境,每次都能遇到点新花样。今天我把最稳的一套方案给你梳理清楚。
2.1 为什么我推荐Ubuntu 22.04 LTS?
说实话,你用18.04或者20.04也能跑,但22.04的GStreamer版本是1.20,OpenCV的Python绑定也最省心。我个人习惯用LTS版本,毕竟做课程不能让大家三天两头遇到兼容性问题。
你想想看,如果GStreamer版本太老,有些插件得自己编译,那多折腾。所以咱们一步到位,用22.04。
2.2 GStreamer安装:两条路,我选第二条
GStreamer的安装方式主要有两种:
| 方式 | 命令 | 适用场景 |
|---|---|---|
| 最小安装 | sudo apt install libgstreamer1.0-0 |
只需要核心库 |
| 完整安装 | sudo apt install libgstreamer1.0-* gstreamer1.0-* |
开发调试、插件齐全 |
我建议你选完整安装。为什么呢?因为GStreamer的插件体系很庞大,缺一个插件就可能导致管道跑不起来。我曾经在项目里因为少了gstreamer1.0-plugins-bad,调试了整整一个下午,最后发现就是个安装问题。
我的安装命令(推荐):
sudo apt update
sudo apt install libgstreamer1.0-0 gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav libgstreamer-plugins-base1.0-dev
嗯,这里要注意:libgstreamer-plugins-base1.0-dev这个开发包一定要装,不然你后面编译OpenCV时会找不到GStreamer的头文件。
2.3 OpenCV编译:从源码开始
为什么我不让你直接用apt install python3-opencv?因为那个版本太旧,而且默认没开GStreamer支持。咱们要的是联合开发,必须让OpenCV能调用GStreamer的管道。
编译前,先装依赖:
sudo apt install build-essential cmake git pkg-config libgtk-3-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
gfortran openexr libatlas-base-dev python3-dev python3-numpy \
libtbb2 libtbb-dev libdc1394-22-dev
然后下载源码:
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
mkdir build && cd build
关键一步:CMake配置时一定要打开GStreamer支持。我见过太多人编译完了才发现没开这个开关,又得重来。
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_GSTREAMER=ON \
-D WITH_V4L=ON \
-D WITH_LIBV4L=ON \
-D WITH_TBB=ON \
-D WITH_OPENEXR=ON \
-D BUILD_opencv_python3=ON \
-D PYTHON_EXECUTABLE=$(which python3) \
..
编译时,我建议用make -j$(nproc),充分利用多核。我第一次编译时用了单核,等了快一个小时。后来发现加个-j4,十几分钟就搞定了。
2.4 Python绑定配置:让OpenCV认识GStreamer
编译完成后,Python绑定会自动生成在build/lib/python3目录下。你需要把它复制到Python的site-packages里:
sudo make install
sudo ldconfig
验证一下:
python3 -c "import cv2; print(cv2.getBuildInformation())" | grep GStreamer
如果看到GStreamer: YES,那就成了。如果显示NO,别慌,检查一下CMake配置里WITH_GSTREAMER是不是真的开了。
我曾经踩过的坑:有一次编译时忘记装libgstreamer-plugins-base1.0-dev,CMake检测不到GStreamer,直接跳过了。所以依赖一定要装全,别偷懒。
2.5 验证Hello World管道
环境搭好了,咱们跑个最简单的管道试试。GStreamer的Hello World就是播放一个测试视频源:
gst-launch-1.0 videotestsrc ! autovideosink
如果看到一个彩条图案在跳动,恭喜你,GStreamer安装成功了。
接下来用Python调用OpenCV,通过GStreamer管道读取视频:
import cv2
# 用GStreamer管道打开摄像头
pipeline = "v4l2src device=/dev/video0 ! videoconvert ! appsink"
cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)
if not cap.isOpened():
print("无法打开摄像头,检查GStreamer管道")
exit()
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("GStreamer + OpenCV", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
这个例子虽然简单,但意义重大。它证明了OpenCV能通过GStreamer管道获取数据,而不是走V4L2原生接口。后面咱们做复杂的管道拼接、硬件编解码,都是基于这个基础。
2.6 常见问题与避坑指南
- 问题1:
gst-launch-1.0找不到命令。解决:检查gstreamer1.0-tools是否安装。 - 问题2:OpenCV编译时
WITH_GSTREAMER显示NO。解决:安装libgstreamer-plugins-base1.0-dev,重新cmake。 - 问题3:Python导入cv2报错
ImportError: libgstreamer-1.0.so.0。解决:运行sudo ldconfig刷新动态库缓存。
我曾经在给团队搭建环境时,遇到一个特别诡异的问题:OpenCV编译时明明显示GStreamer支持开了,但运行时就是报错。最后发现是系统里同时装了多个版本的GStreamer,链接器找错了库。解决办法是用ldd检查cv2.so链接的库路径,手动指定正确的版本。
好了,环境搭好了,咱们就可以开始真正的联合开发了。下一章我会带你写第一个完整的GStreamer管道,并用OpenCV处理里面的每一帧数据。