> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# qtiredissink

> 用于实时发布基于文本元数据的 Redis Pub/Sub sink 插件

# 概述

**qtiredissink** 是一个 GStreamer sink 元素，通过 Redis Pub/Sub 将基于文本的管道输出实时发布到 Redis 服务器。它接受来自上游元素的 `text/x-raw` 缓冲区，并将每个缓冲区作为消息转发到配置的 Redis 频道。

它专为媒体和 AI 管道设计，用于将机器学习结果、分析输出或序列化元数据以最少的集成工作交付给后端系统、仪表板或分布式消费者。

**支持的负载类型：**

* 机器学习元数据 — 检测/分类结果、跟踪信息
* 应用程序生成的消息或序列化的自定义数据
* JSON 或其他序列化文本负载

**qtiredissink** 在内部管理 Redis 连接和发布，减少了将 GStreamer 管道与 Redis 消息桥接所需的应用逻辑。

**核心能力：**

* **Redis 连接** — 使用可配置的主机和端口连接到 Redis 服务器，支持可选的身份验证
* **基于频道的发布** — 将每个传入的缓冲区发送到选定的 Redis Pub/Sub 频道
* **实时数据转发** — 元数据或文本输出一到达即发布

<Tip>
  - `qtiredissink` 是一个 sink 元素 — 它终止管道分支。
  - 它只接受 `text/x-raw` 输入；不适用于原始音频或视频传输。
  - 消息仅投递给当前已连接的订阅者，**不会保留**以供后续投递。
  - 发布前必须配置有效的 `channel`。
</Tip>

<img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/IMSDK/plugin-reference/images/qtiredissink_arch.png" alt="qtiredissink_arch" />

## 示例管道

<img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/IMSDK/plugin-reference/images/qtiredissink_example_pipeline.png" alt="" />

<Steps>
  <Step title="下载所需文件">
    | 文件            | 下载                                                                                                                           | 保存为                         |
    | ------------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------- |
    | YOLOX W8A8 模型 | [Qualcomm AI Hub — YOLOX](https://aihub.qualcomm.com/iot/models/yolox)                                                       | `yolo_x_w8a8.tflite`        |
    | 检测标签          | <a href="/SDKs/IMSDK/labels/yolov8.json" download="yolov8.json">yolov8.json</a>                                              | `yolov8.json`               |
    | 示例视频          | <a href="https://github.com/qualcomm/sample-apps-for-qualcomm-linux/raw/refs/heads/main/artifacts/videos/video.mp4">输入视频</a> | `Draw_1080p_180s_30FPS.mp4` |
  </Step>

  <Step title="将文件复制到设备">
    <CodeGroup>
      ```bash SCP (SSH) theme={null}
      # Replace $HOME to the appropriate device path before running the commands.
      # For QLI:    /root
      # For Ubuntu: /home/ubuntu
      # Modify this based on your platform and ensure files are copied to the correct location on the device.
      # Run from your host machine — replace <user> and <device-ip>

      ssh <user>@<device-ip> "mkdir -p $HOME/{models,labels,media,media/output}"
      scp yolo_x_w8a8.tflite          <user>@<device-ip>:$HOME/models/
      scp yolov8.json                  <user>@<device-ip>:$HOME/labels/
      scp Draw_1080p_180s_30FPS.mp4   <user>@<device-ip>:$HOME/media/
      ```
    </CodeGroup>
  </Step>

  <Step title="连接到设备">
    <CodeGroup>
      ```bash SCP (SSH) theme={null}
      # Run from your host machine — replace <user> and <device-ip>
      ssh <user>@<device-ip>
      ```
    </CodeGroup>
  </Step>

  <Step title="设置环境变量">
    在设备上运行以下命令

    ```bash theme={null}
    export MODEL_NAME=yolo_x_w8a8.tflite
    export LABELS_NAME=yolov8.json
    export SRC_VIDEO_NAME=Draw_1080p_180s_30FPS.mp4
    ```
  </Step>

  <Step title="运行管道">
    ```bash theme={null}
    gst-launch-1.0 -e --gst-debug=2 \
    filesrc location=$HOME/media/$SRC_VIDEO_NAME ! qtdemux ! h264parse ! \
    v4l2h264dec capture-io-mode=4 output-io-mode=4 ! video/x-raw,format=NV12 ! queue ! \
    qtimlvconverter ! queue ! \
    qtimltflite model=$HOME/models/$MODEL_NAME delegate=external external-delegate-path=libQnnTFLiteDelegate.so \
      external-delegate-options="QNNExternalDelegate,backend_type=htp,log_level=(string)1;" ! queue ! \
    qtimlpostprocess module=yolov8 labels=$HOME/labels/$LABELS_NAME \
      settings="{\"confidence\": 51.0}" ! text/x-raw ! qtiredissink host=127.0.0.1 port=6379 channel=ml_results

    #Listen to the published data with Redis CLI from another shell:
    redis-cli SUBSCRIBE detections
    ```
  </Step>
</Steps>

# 层级结构

[GObject](https://docs.gtk.org/gobject/)<br />
   <Icon icon="arrow-turn-down-right" iconType="solid" />[GstObject](https://gstreamer.freedesktop.org/documentation/gstreamer/gstobject.html?gi-language=c)<br />
      <Icon icon="arrow-turn-down-right" iconType="solid" />[GstElement](https://gstreamer.freedesktop.org/documentation/gstreamer/gstelement.html?gi-language=c)<br />
         <Icon icon="arrow-turn-down-right" iconType="solid" />[GstBaseSink](https://gstreamer.freedesktop.org/documentation/base/gstbasesink.html?gi-language=c)<br />
            <Icon icon="arrow-turn-down-right" iconType="solid" />qtiredissink

# Pad 模板

### sink

| 能力           |              |
| ------------ | ------------ |
| `text/x-raw` | `format: NA` |
| 可用性：*Always* |              |
| 方向：*sink*    |              |

# 元素属性

| 属性         | 描述                                                                                                                                         |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `channel`  | 发布消息的目标 Redis Pub/Sub 频道。<br /><br />`Type: String`<br />`Default: NULL`<br />`Flags: readable/writable`                                   |
| `host`     | Redis 服务器主机名或 IP 地址。<br /><br />`Type: String`<br />`Default: "127.0.0.1"`<br />`Flags: readable/writable`                                 |
| `password` | 用于 Redis 身份验证的密码。<br /><br />`Type: String`<br />`Default: NULL`<br />`Flags: readable/writable`                                           |
| `port`     | Redis 服务器 TCP 端口。<br /><br />`Type: Unsigned Integer`<br />`Default: 6379`<br /> `Range: 0 - 4294967295` <br /> `Flags: readable/writable` |
| `username` | 用于 Redis 身份验证的用户名。<br /><br />`Type: String`<br />`Default: NULL`<br />`Flags: readable/writable`                                          |

# 内部架构与消息模型

**qtiredissink** 连接到配置的 Redis 主机和端口（支持可选身份验证），读取每个传入的 `text/x-raw` 缓冲区，并使用 Redis 的 `PUBLISH` 命令将其内容发布到指定频道。

由于它使用 Pub/Sub，消息仅实时投递给当前已连接的订阅者，不会保留以供后续投递。这使得该元素适合实时元数据和事件分发，而非持久化存储。

### 自定义负载支持

**qtiredissink** 可以传输任何自定义文本或序列化负载，只要它是 `text/x-raw`。这适用于：

* 序列化为文本的传感器或遥测数据
* 应用特定的元数据，例如 JSON
* 事件通知和状态消息
* IMSDK 原生不支持的任何 AI 元数据

***

# 用法

<Note>
  继续之前，请确保已完成[前提条件](qtiredissink#example-pipeline)
</Note>

### 带视频叠加和 Redis 元数据流传输的 AI 管道

该管道对离线视频执行目标检测。推理结果由 [`qtimetamux`](qtimetamux) 以元数据的形式附加到每一帧，由 [`qtimlmetaparser`](qtimetaparser) 转换为 JSON，并由 **qtiredissink** 发布到 Redis 频道。同时，视频流继续进入显示路径，在屏幕上渲染检测叠加层。这将元数据分发与视频渲染分离开来，使外部应用能够通过 Redis 独立于所显示的视频来消费实时推理结果。

<img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/IMSDK/plugin-reference/images/qtiredissink_ex1.png" alt="qtiredissink_arch" />

```bash theme={null}
gst-launch-1.0 filesrc location=$HOME/media/$SRC_VIDEO_NAME ! qtdemux ! h264parse ! v4l2h264dec capture-io-mode=4 output-io-mode=4 ! video/x-raw,format=NV12 ! queue ! tee name=t t. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=$HOME/models/$MODEL_NAME ! queue ! qtimlpostprocess module=yolov8 results=6 labels=$HOME/labels/$LABELS_NAME ! queue ! text/x-raw ! metamux. t. ! qtimetamux name=metamux ! qtivoverlay ! tee name=t_split_4 t_split_4. ! queue ! waylandsink sync=false fullscreen=true t_split_4. ! queue ! qtimlmetaparser module=json ! qtiredissink sync=false async=false channel=ml_results host=127.0.0.1 port=6379
```

使用 Redis CLI 监听发布的数据：

```bash theme={null}
redis-cli SUBSCRIBE ml_results
```

***

### 元数据直接流式传输到 Redis 的 AI 管道

该管道对离线视频执行目标检测。解码后的帧经过推理和后处理阶段，生成结构化文本形式的检测结果。该输出直接由 **qtiredissink** 消费，将推理元数据发布到 Redis 频道 — 不包含任何视频叠加或显示路径。

<img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/IMSDK/plugin-reference/images/qtiredissink_ex2.png" alt="qtiredissink_arch" />

```bash theme={null}
gst-launch-1.0 -e --gst-debug=2 filesrc location=$HOME/media/$SRC_VIDEO_NAME ! qtdemux ! h264parse ! v4l2h264dec capture-io-mode=4 output-io-mode=4 ! video/x-raw,format=NV12 ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=$HOME/models/$MODEL_NAME ! queue ! qtimlpostprocess results=5 module=yolov8 labels=$HOME/labels/$LABELS_NAME ! text/x-raw ! queue ! qtiredissink host=127.0.0.1 port=6379 channel=detections
```

使用 Redis CLI 监听发布的数据：

```bash theme={null}
redis-cli SUBSCRIBE detections
```
