# multi-streamer **Repository Path**: sambios/multi-streamer ## Basic Information - **Project Name**: multi-streamer - **Description**: 用来测试多路解码性能、推理性能等,该应用只显示统计数据,如果要视频显示,请下载客户端进行显示。 - **Primary Language**: C++ - **License**: LGPL-2.1 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-01 - **Last Updated**: 2025-11-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Multi-Streamer ## 一、docker基础环境准备 ### (一)/data/demo目录结构 ``` demo ├─ multi-streamer ├─ otl └─ test_car_person_1080P.h264 ``` ### (二)运行docker 需将主机的/data/目录挂载到docker,执行以下命令: ```bash docker run -itd --name yolo-demo \ --volume=/data:/data \ --ipc=host --ulimit core=-1 --security-opt seccomp=unconfined \ --network host --privileged \ all_in_one_x86_image:v1 bash ``` ### (三)进入docker准备demo运行环境 执行命令进入docker容器: ```bash docker exec -it yolo-demo bash ``` ### (四)配置python运行版本 将python运行版本配置为python3.10,执行以下两条命令: ```bash ln -sf /usr/local/bin/python3.10 /usr/bin/python ln -sf /usr/local/bin/pip3.10 /usr/local/bin/pip3 ``` ### (五)更新pip源和apt源 1. 更新pip源: ```bash pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple ``` 2. 更新apt源: ```bash cat /etc/apt/sources.list.bak > /etc/apt/sources.list apt update ``` ### (六)安装依赖包 1. 安装python依赖包: ```bash pip3 install flask ``` 2. 安装系统依赖包: ```bash apt -y install libavdevice-dev libavdevice58 nlohmann-json3-dev ``` ## 三、VPU 多路解码demo(multi-streamer) ### (一)准备源视频文件 1. 进入docker容器(若已在容器内可跳过此步): ```bash docker exec -it yolo-demo bash ``` 2. 转换视频格式生成源视频文件: ```bash /opt/tops/bin/ffmpeg -i enrigin_yolo/test_car_person_1080P.mp4 -c:v copy -an test_car_person_1080P.h264 ``` ### (二)编译multi-streamer 1. 进入docker容器(若已在容器内可跳过此步): ```bash docker exec -it yolo-demo bash ``` 2. 复制文件并配置环境变量: ```bash cd /data/demo cp codec_sample/hwcontext.c codec_sample/pixfmt.h /usr/include/x86_64-linux-gnu/libavutil/ export VCE_SHRED_LIB=/opt/tops/lib/libh2enc.so ``` 3. 创建编译目录并执行编译: ```bash cd multi-streamer mkdir build cd build cmake .. make -j10 ``` ### (三)运行demo 1. 检查或修改配置文件 `multi-streamer/config.json`(程序优先在当前工作目录查找`config.json`,若不存在则回退到`../../multi-streamer/config.json`): 示例配置: ```json { "dev_list": [0], "detect_enabled": true, "model_path": "~/clients/main/models/yolov5s.onnx", "ppset_enabled": true, "pp_scale": 0.3333333, "ppset_info": "640x360:0:0:0:1920x1080", "decode_buffer_type": 1, "tracker_enabled": false, "configs_dev0": [ { "input_url": "~/test_videos/test_car_person_1080P.h264", "frame_drop_interval": 2, "output_url_base": "udp://127.0.0.1:9000", "client_count": 2, "detect_stride": 1, "output_delay_ms": 0 } ] } ``` 参数说明: - `dev_list`:设备ID列表(例如 `[0,1]`)。程序将为每个设备加载对应的 `configs_devX`。 - `detect_enabled`:是否开启检测/跟踪流水线(控制是否启动检测与统计输出)。 - `model_path`:检测模型路径,支持`~`,程序启动时会展开(使用 `enrigin::replaceHomeDirectory`)。 - `ppset_enabled`:是否启用预处理 `pp_set`(启用后解码输出为BGR24并走预处理分支)。 - `pp_scale`:预处理缩放系数,用于将推理框恢复到原尺寸。 - `ppset_info`:预处理参数字符串(例如 `640x360:0:0:0:1920x1080`)。 - `decode_buffer_type`:解码器 `buffer_type`,通过 `AVDictionary` 传入。 - `tracker_enabled`:是否启用多目标跟踪(基于 BYTETracker)。 - `configs_devX`:每张卡的配置列表。 - `input_url`:输入流/文件地址。 - `frame_drop_interval`:丢帧间隔(目前在配置中保存)。 - `output_url_base`:基础输出地址,格式如 `udp://IP:PORT`。 - `client_count`:为该条目复制的并发路数,端口会在 `PORT` 基础上按路数自增。 - `detect_stride`:可选。每隔多少帧做一次检测(>=1,默认1表示每帧都检测)。 - `output_delay_ms`:可选。发送端输出延时(毫秒),用于对齐检测结果与输出帧(仅透传路径有效)。 生成的输出:程序会为每个配置按 `client_count` 生成多路输出,并将端口从 `output_url_base` 的端口开始依次递增,例如 `udp://127.0.0.1:9000`、`udp://127.0.0.1:9001` 等。 检测与输出: - 当 `detect_enabled=true` 时,程序对每帧进行检测,并在日志中输出各阶段队列与 FPS 信息。 - 透传路径(未重编码)下,检测结果以 SEI 方式注入到 H264/H265 码流中并透传到 `output_url`。 - 开启重编码(`encodeEnabled=true`)时,将以 H264 1280x720、无 B 帧、约 3Mbps 的方式编码,并在图像上叠加检测框后输出。 2. 运行程序: ```bash cd multi-streamer/build ./video_detection ``` 3. 命令行参数: - 当前版本未定义自定义命令行参数。程序仅自动查找`config.json`(搜索顺序:工作目录 -> `../../multi-streamer/config.json`)。 ### (四)测试输出结果 ``` open url=udp://127.0.0.1:9102,format_name=h264 Output #0, h264, to 'udp://127.0.0.1:9102': Stream #0:0: Video: h264 (Main), 1 reference frame, yuv420p(progressive, left), 1920x1080 (0x0) [SAR 1:1 DAR 16:9], q=2-31 create decoderID = 0, hwdevicectx /dev/gcu0vid0 Decoder: h264_vsv_decoder, device type: vsv. hw_pix_fmt 198 [h264_mp4toannexb @ 0x7fa96c74b660] The input looks like it is Annex B already create video decoder ok! id=0, ffmpeg delayed frames: 0 ch-num=128 FPS=-nan ch-num=128 FPS=3086.27 ch-num=128 FPS=3079.11 ch-num=128 FPS=3076.79 ch-num=128 FPS=3075.61 ch-num=128 FPS=3071.94 ch-num=128 FPS=3072.05 ch-num=128 FPS=3072.01 ch-num=128 FPS=3071.99 ch-num=128 FPS=3072.03 ch-num=128 FPS=3072.05 ch-num=128FPS=3072.03 ch-num=128 FPS=3072.12 ``` ### (五)D10VPU使用率和状态监控 1. 监控命令: ```bash ersmi-dmon-sv ``` 2. 监控输出结果: ``` (base)[root4090-10-16-201-1~]#ersmi-dmon-sv ----Enrigin System Management Interface ------------- Enrigin Tech, All Rights Reserved.2024 Copyright(C) *Dev VPU0_DECO VPU0_DEC1 VPU0_DEC2 VPU0_DEC3 VPU0_ENC VPU1_DECO VPU1_DEC1 VPU1_DEC2 VPU1_DEC3 VPU1_ENC *Idx 号 号 号 号 0 号 号 号 号 0 0 65 65 65 65 0 65 65 65 65 0 0 65 65 65 65 0 65 65 65 65 0 0 65 65 65 65 0 65 65 65 65 0 0 64 64 64 64 0 64 64 64 64 0 0 63 63 63 63 0 63 63 63 63 0 0 65 65 65 65 0 65 65 65 65 0 0 65 65 65 65 0 65 65 65 65 0 ``` ### (五)D10使用率和状态监控 1. 监控命令: ```bash ersmi -dmon ``` 2. 监控输出结果: ``` (base) [root@4090-10-16-201-1 ~]# ersmi -dmon ------------------------- Enrigin System Management Interface ------------------------ ---------------- Enrigin Tech, All Rights Reserved. 2024 Copyright (C) --------------- | *Dev Idx | Pwr (W) | DTemp (°C) | Sip (%) | DUsed (%) | Dpm | MUsed | Mem (MiB) | Dclk (MHz) | Mclk (MHz) | VOLT (V) | TxPCI (MiB/s) | RxPCI (MiB/s) | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 0 | 51 | 48. | 100.0 | 100.0 | Active | 2.0 | 57340 | 1000 | 6400 | 0.852 | 0 | 59% | | 0 | 51 | 48. | 100.0 | 100.0 | Active | 2.0 | 57340 | 1000 | 6400 | 0.852 | 0 | 62. | | 0 | 51 | 48. | 100.0 | 100.0 | Active | 2.0 | 57340 | 1000 | 6400 | 0.860 | 2692 | 10561 | | 0 | 51 | 48. | 100.0 | 100.0 | Active | 2.0 | 57340 | 1000 | 6400 | 0.850 | 0 | 1798 |