DeepStream使用简介

       DeepStream 是 NVIDIA 提供的一个基于 GStreamer 的多媒体处理框架,专为构建高效的智能视频分析(IVA)应用而设计。它结合了深度学习、计算机视觉和视频处理技术,广泛应用于视频监控、自动驾驶、零售分析等领域。DeepStream 支持多种深度学习模型(如 TensorRT、PyTorch、TensorFlow 等),并提供了高效的硬件加速(利用 GPU 和 NVIDIA 的硬件编解码器)。下面就其使用进行如下总结:

(1)DeepStream 的核心组件

  1. GStreamer

    • DeepStream 基于 GStreamer 框架,使用插件(plugins)和管道(pipelines)来处理多媒体数据流。

    • 每个插件负责特定的任务,如解码、推理、跟踪、渲染等。

  2. DeepStream SDK

    • 提供了一系列预构建的插件和工具,简化了视频分析应用的开发。

    • 支持多路视频流、多模型推理、对象跟踪、元数据生成等功能。

  3. TensorRT 集成

    • DeepStream 使用 TensorRT 加速深度学习模型的推理。

  4. 硬件加速

    • 利用 NVIDIA GPU 和硬件编解码器(如 NVENC、NVDEC)实现高效的视频处理。

(2)DeepStream 安装使用

DeepStream 可以运行在以下平台上:

  • Jetson 设备(如 Jetson Xavier NX)
  • x86 服务器(需要 NVIDIA GPU)

安装步骤:

  1. 安装 NVIDIA 驱动程序和 CUDA。
  2. 安装 TensorRT。
  3. 安装 DeepStream SDK(从 NVIDIA Developer 网站 下载)。
  4. 验证安装:运行示例应用程序以确保工作正常。
###安装依赖
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 官方文档

### 使用 DeepStream SDK 实现推流和拉流 #### 推流操作 为了使用 DeepStream SDK 将视频流推送至 RTMP 或其他服务器,通常会采用 GStreamer 插件来构建管道。GStreamer 是一个强大的多媒体框架,允许创建复杂的音频/视频处理流水线。 对于推流功能而言,`nvv4l2h264enc` 编码器与 `rtph264pay` 支付负载插件组合起来非常有用。下面是一个简单的 Python 脚本例子,展示了如何配置并启动一个向指定 URL 发送 H.264 编码 RTP 数据包的流程[^1]: ```python import gi gi.require_version('Gst', '1.0') from gi.repository import Gst, GObject def create_pipeline(): pipeline_str = ( "v4l2src device=/dev/video0 ! " "videoconvert ! nvvidconv ! nvh264enc bitrate=8000000 ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=localhost port=5000" ) return Gst.parse_launch(pipeline_str) if __name__ == "__main__": # Initialize GStreamer Gst.init(None) # Create the pipeline pipeline = create_pipeline() # Start playing pipeline.set_state(Gst.State.PLAYING) try: loop = GObject.MainLoop() loop.run() except KeyboardInterrupt: pass # Clean up pipeline.set_state(Gst.State.NULL) ``` 此脚本设置了一个从摄像头读取原始帧并通过 UDP 协议发送编码后的 H.264 流的过程。实际应用中可能还需要调整参数以适应特定需求,比如改变源地址、目标 IP 地址以及端口号等。 #### 拉流操作 当涉及到接收远程媒体资源时,则需要用到不同的组件集。例如,可以通过 `rtspsrc` 来连接到 RTSP 服务器获取实时音视频内容;而如果要直接对接 RTMP 流,则有专门为此目的设计的 gstreamer 插件如 `flvmux` 和 `rtmpsink` 可供选用[^2]。 这里给出一段基于上述提到的技术栈编写的小程序片段,它能够监听来自网络上的 RTSP 链接并将接收到的画面展示出来: ```python import gi gi.require_version('Gst', '1.0') from gi.repository import Gst, Gtk, GdkX11, GstVideo def build_player_pipeline(uri): player_factory = """ rtspsrc location={} latency=0 ! decodebin ! videoconvert ! autovideosink sync=false """.format(uri).strip().replace('\n', '') return Gst.parse_launch(player_factory) if __name__ == '__main__': uri = "rtsp://example.com/stream" # 初始化环境变量 Gst.init([]) window = Gtk.Window(title="RTSP Player") drawing_area = Gtk.DrawingArea() window.add(drawing_area) window.connect("destroy", lambda w: Gtk.main_quit()) window.show_all() pipeline = build_player_pipeline(uri) bus = pipeline.get_bus() bus.enable_sync_message_emission() bus.connect("sync-message::element", on_sync_message, drawing_area) pipeline.set_state(Gst.State.PLAYING) Gtk.main() def on_sync_message(bus, message, drawing_area): if not message.structure is None and message.structure.has_field("xwindow_id"): win_id = drawing_area.get_property("window").get_xid() imagesink = message.src imagesink.set_window_handle(win_id) ``` 这段代码实现了基本的功能——打开给定 URI 所指向的服务,并在一个 GTK+ 应用窗口内呈现所获得的数据流画面。需要注意的是,在生产环境中应当考虑错误处理机制和服务稳定性保障措施等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomu_347

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值