DeepStream 是 NVIDIA 提供的一个基于 GStreamer 的多媒体处理框架,专为构建高效的智能视频分析(IVA)应用而设计。它结合了深度学习、计算机视觉和视频处理技术,广泛应用于视频监控、自动驾驶、零售分析等领域。DeepStream 支持多种深度学习模型(如 TensorRT、PyTorch、TensorFlow 等),并提供了高效的硬件加速(利用 GPU 和 NVIDIA 的硬件编解码器)。下面就其使用进行如下总结:
(1)DeepStream 的核心组件
-
GStreamer:
-
DeepStream 基于 GStreamer 框架,使用插件(plugins)和管道(pipelines)来处理多媒体数据流。
-
每个插件负责特定的任务,如解码、推理、跟踪、渲染等。
-
-
DeepStream SDK:
-
提供了一系列预构建的插件和工具,简化了视频分析应用的开发。
-
支持多路视频流、多模型推理、对象跟踪、元数据生成等功能。
-
-
TensorRT 集成:
-
DeepStream 使用 TensorRT 加速深度学习模型的推理。
-
-
硬件加速:
-
利用 NVIDIA GPU 和硬件编解码器(如 NVENC、NVDEC)实现高效的视频处理。
-
(2)DeepStream 安装使用
DeepStream 可以运行在以下平台上:
- Jetson 设备(如 Jetson Xavier NX)
- x86 服务器(需要 NVIDIA GPU)
安装步骤:
- 安装 NVIDIA 驱动程序和 CUDA。
- 安装 TensorRT。
- 安装 DeepStream SDK(从 NVIDIA Developer 网站 下载)。
- 验证安装:运行示例应用程序以确保工作正常。
###安装依赖
sudo apt-get install libssl1.0.0 libgstreamer1.0-0 gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav libgstrtspserver-1.0-0 libjansson4 libyaml-cpp-dev
###安装deepstream
sudo apt-get install ./deepstream-6.1_6.1.0-1_amd64.deb
##验证
deepstream-app --version
CLI示例
同时DeepStream提供了很多示例,位于 /opt/nvidia/deepstream/deepstream-6.1/samples/
目录下。
###单路视频流处理
deepstream-app -c /opt/nvidia/deepstream/deepstream-6.1/samples/configs/deepstream-app/source1_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
###多路视频流处理
deepstream-app -c /opt/nvidia/deepstream/deepstream-6.1/samples/configs/deepstream-app/source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
同时DeepStream 还支持使用配置文件(.txt
文件)来定义管道的结构,自定义模型和参数等。可以通过修改配置文件来适应不同的应用场景。
[application]
enable-perf-measurement=1
perf-measurement-interval-sec=5
[source0]
enable=1
type=1
uri=file:///opt/nvidia/deepstream/deepstream-6.1/samples/streams/sample_1080p_h264.mp4
num-sources=1
[primary-gie]
enable=1
gpu-id=0
model-engine-file=/opt/nvidia/deepstream/deepstream-6.1/samples/models/Primary_Detector/resnet18.caffemodel_b8_gpu0_int8.engine
config-file=/opt/nvidia/deepstream/deepstream-6.1/samples/configs/deepstream-app/config_infer_primary.txt
DeepStream 开发
DeepStream 的典型工作流包括以下组件:
- 输入源:RTSP 流、MP4 文件或相机。
- 解码器:硬件加速解码(如 NVIDIA 的 NVDEC)。
- 推理模型:通过 TensorRT 加速,支持定制的 TensorFlow、PyTorch 模型。
- 后处理:NMS、对象跟踪、动作识别等。
- 输出:绘制结果并显示,或将结果推送到 Kafka、MQTT 等服务。
DeepStream 提供了 Python /c++ API,方便开发者快速构建应用。
##安装
pip install deepstream_python
##使用
import pyds
# 初始化 DeepStream
pyds.deepstream_init()
# 创建管道
pipeline = pyds.Pipeline("my-pipeline")
pipeline.set_config("config-file.txt")
# 启动管道
pipeline.start()
(3)结合RTSP视频推流
RTSP(Real-Time Streaming Protocol) 是一种网络控制协议,用于控制实时流媒体服务器。它通常与 RTP(Real-time Transport Protocol)一起使用,用于传输音视频数据。
-
RTSP 推流:将视频流从服务器推送到客户端。
-
RTSP 拉流:客户端从服务器拉取视频流。
结合 DeepStream 的 RTSP 推流 是一种常见的应用场景,主要用于将经过智能视频分析(如对象检测、跟踪等)的视频流通过网络实时传输到客户端或其他系统。DeepStream 提供了 GStreamer 插件,可以轻松实现 RTSP 推流。以下是实现 RTSP 推流的关键步骤:
》修改 GStreamer 管道
在 DeepStream 的 GStreamer 管道中,将视频流的输出从本地渲染(如 nveglglessink
)改为 RTSP 推流。常用的插件是 rtspclientsink 或 rtp payloader + udpsink。
》 使用 RTSP 服务器
需要一个 RTSP 服务器来接收和分发视频流。常用的 RTSP 服务器包括:
-
GStreamer 的
gst-rtsp-server
:轻量级,适合嵌入式设备。 -
FFmpeg:功能强大,支持多种协议。
-
Live555:开源的 RTSP 服务器。
》具体示例
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject
# 初始化 GStreamer
Gst.init(None)
# 创建管道
pipeline = Gst.parse_launch(
"filesrc location=sample.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! "
"nvstreammux name=mux batch-size=1 width=1280 height=720 ! nvinfer config-file-path=config_infer_primary.txt ! "
"nvtracker tracker-width=640 tracker-height=480 ll-lib-file=libnvds_nvdcf_tracker.so ll-config-file=tracker_config.txt ! "
"nvosd ! queue ! nvvideoconvert ! nvv4l2h264enc ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=5000"
)
# 启动管道
pipeline.set_state(Gst.State.PLAYING)
# 监听消息总线
bus = pipeline.get_bus()
while True:
message = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.ERROR | Gst.MessageType.EOS)
if message:
print(message.parse_error()) if message.type == Gst.MessageType.ERROR else print("End of Stream")
break
# 停止管道
pipeline.set_state(Gst.State.NULL)
然后,启动rtsp 服务,就可以从 UDP 端口 5000 接收 RTP 包,利用rtph264depay解封装 RTP 包,然后将视频流发布为 RTSP 流。
gst-rtsp-server -m /live "udpsrc port=5000 ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! rtph264depay ! queue ! rtspclientsink location=rtsp://127.0.0.1:8554/live"
或者直接使用ffmpeg
ffmpeg -re -i udp://127.0.0.1:5000 -c copy -f rtsp rtsp://127.0.0.1:8554/live
最后使用支持 RTSP 的客户端(如 VLC、FFplay)拉取视频流
ffplay rtsp://127.0.0.1:8554/live
vlc rtsp://127.0.0.1:8554/live
对于deepstream的使用还需要结合了硬件解码、深度学习推理、对象跟踪和渲染功能。通过修改管道配置和插件参数,可以适应不同的应用场景。如果需要更高级的功能,可以参考 DeepStream 官方文档。