
在 DeepStream 的示例程序中deepstream-server-app是一个很有代表性的样例。它的核心目的是演示如何通过nvmultiurisrcbin使用 REST API 动态管理视频流。官方 README 里有一句话非常关键The deepstream-server-app uses nvmultiurisrcbin to demonstrate REST API server functionality.也就是说这个 sample 并不是单纯展示一个固定输入的视频分析 pipeline而是展示一个可以在运行时通过 HTTP 请求添加、删除、配置视频流的 DeepStream 服务。nvmultiurisrcbin 是什么nvmultiurisrcbin是 DeepStream 提供的一个 GStreamer Bin。它把几个常用能力封装在一起nvurisrcbin负责处理单路 URI 输入比如本地文件、RTSP 流等。nvstreammux负责把多路输入 batch 到一起。nvds_rest_server提供 REST API 服务用于运行时控制 pipeline。因此使用nvmultiurisrcbin后应用不需要自己手动创建每一路 source bin也不需要自己处理 streammux sink pad 的申请和释放。应用只需要配置nvmultiurisrcbin然后通过 REST API 动态添加或删除 stream。deepstream-server-app 的整体 pipeline这个 sample 的主程序在apps/deepstream/sample_apps/deepstream-server/deepstream_server_app.cpp默认 pipeline 大致是nvmultiurisrcbin- queue- nvdspreprocess- nvinfer / nvinferserver- nvdsanalytics / identity- nvdslogger- nvmultistreamtiler- nvvideoconvert- nvdsosd- sink其中最重要的入口就是nvmultiurisrcbin。它负责输出已经 batch 好的 buffer后面的推理、分析、显示都和普通 DeepStream 多路 pipeline 类似。REST Server 默认运行在 nvmultiurisrcbin 内部配置文件是apps/deepstream/sample_apps/deepstream-server/dsserver_config.yml默认配置里有rest-server:within_multiurisrcbin: 1这表示 REST server 由nvmultiurisrcbin自己内部启动和管理。同时multiurisrcbin配置里指定了监听端口、初始输入源、batch size、mux 分辨率等multiurisrcbin:uri-list: file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4port: 9000live-source: 1width: 1920height: 1080batched-push-timeout: 33333max-batch-size: 8drop-pipeline-eos: 1这里的port: 9000表示 REST API 服务监听在localhost:9000。通过 REST API 动态添加视频流sample README 中给出的添加 stream 请求如下curl -XPOST http://localhost:9000/api/v1/stream/add -d {key: sensor,value: {camera_id: uniqueSensorID1,camera_name: front_door,camera_url: file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4,change: camera_add,metadata: {resolution: 1920 x1080,codec: h264,framerate: 30}},headers: {source: vst,created_at: 2021-06-01T14:34:13.417Z}}其中真正关键的字段是camera_id唯一的 sensor ID。camera_url视频源地址可以是本地文件也可以是 RTSP。change动作类型比如camera_add。在nvmultiurisrcbin内部只要change字符串包含add或streaming就会走添加 source 的逻辑。也就是说source 类型不是由camera_add或camera_streaming决定的而是由camera_url决定的file:///... - 本地文件rtsp://... - RTSP 实时流http://... - HTTP URL通过 REST API 删除视频流删除 stream 的请求如下curl -XPOST http://localhost:9000/api/v1/stream/remove -d {key: sensor,value: {camera_id: uniqueSensorID1,camera_name: front_door,camera_url: file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4,change: camera_remove}}删除时nvmultiurisrcbin会根据camera_id和camera_url查找对应的 source然后调用内部 creator API 移除该 source。这个 sample 还演示了什么除了添加和删除 streamdeepstream-server-app还展示了很多运行时控制能力例如更新 ROI。修改 decoder 的drop-frame-interval和skip-frames。修改nvinfer/nvinferserver的 interval。修改 encoder 的 bitrate、force-idr、force-intra。修改nvstreammux的batched-push-timeout。修改nvvideoconvert的 crop、flip、interpolation。修改nvdsosd的 process mode。查询 stream info、metrics、liveness、readiness。通过 REST API 让应用退出。这些能力说明deepstream-server-app不只是一个视频分析 demo而是一个“服务化 DeepStream pipeline”的参考实现。两种 REST Server 模式这个 sample 支持两种模式。第一种是默认模式rest-server:within_multiurisrcbin: 1REST server 在nvmultiurisrcbin内部运行。这也是官方更推荐的简单用法。第二种是rest-server:within_multiurisrcbin: 0这时应用自己启动nvds_rest_server并使用rest_server_callbacks.cpp里的 callback 来处理 REST 请求。需要注意的是这个 app-owned REST callback 版本里stream add 只检查change是否包含add不像nvmultiurisrcbin内部实现那样同时接受streaming。所以默认模式下camera_streaming可以添加流但 app-owned callback 模式下可能不行。总结deepstream-server-app展示的是一种更接近生产服务的 DeepStream 使用方式pipeline 启动后不再局限于固定输入源而是可以通过 REST API 动态添加、删除和配置视频流。nvmultiurisrcbin是这个能力的核心。它把 source 管理、streammux batch、REST API 服务封装在一起让应用层可以专注于后续的推理、分析、显示或消息输出逻辑。如果你想构建一个支持多路摄像头动态接入的 DeepStream 服务deepstream-server-app是最值得先读的 sample。