# ML pipeline 的高效数据/控制流

Source: [https://docs.qualcomm.com/doc/80-70014-50Y/topic/efficient-data-control-flow.html](https://docs.qualcomm.com/doc/80-70014-50Y/topic/efficient-data-control-flow.html)

管理和控制在 docker 和本机 GST 服务中运行的 ML 数据 pipeline 之间的数据流。

以下插件用于在 docker 容器之间传输数据：

- [qtisocketsrc](https://docs.qualcomm.com/doc/80-70014-50Y/topic/qtisocketsrc.html)：从套接字文件中读取数据。
- [qtisocketsink](https://docs.qualcomm.com/doc/80-70014-50Y/topic/qtisocketsink.html)：将数据转储到套接字文件中。

以下用例演示了使用三个 GST 数据 pipeline 的高效数据管理。

- 它们使您能够通过共享内存或域套接字实时处理数据。
- 它们允许您执行第二级处理。

## 前提条件

启用 docker 镜像。相关说明，可参见[容器化](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-27/platform_software_features.html#sub$containerization)。

## 视频编码

在三个单独的控制台中运行以下命令以执行 pipeline：

1. Pipeline 1：启动视频采集并将数据发送到套接字。

        gst-launch-1.0 -e qtisocketsrc socket=/opt/docker/output.sock ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1,compression=ubwc,interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=5 output-io-mode=5 ! h264parse ! mp4mux ! queue ! filesink location=/opt/docker_video.mp4Copy to clipboard
2. Pipeline 2：
    1. 在 docker 容器内运行。
    2. 从输入套接字读取。
    3. 将数据传递到输出套接字。

        docker run -v /opt/docker:/opt -v /usr/lib/gstreamer-1.0/libqtisocketsrc.so:/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsrc.so -v /usr/lib/gstreamer-1.0/libqtisocketsink.so:/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsink.so -ti gst-image-kodiak /bin/bash -c "gst-launch-1.0 -e qtisocketsrc socket=/opt/input.sock ! qtisocketsink socket=/opt/output.sock"Copy to clipboard
3. Pipeline 3：
    1. 从输出套接字读取。
    2. 对视频流数据进行编码。
    3. 将数据保存到文件中。

        gst-launch-1.0 -e qtiqmmfsrc name=camsrc video_0::type=preview ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1,compression=ubwc ! qtisocketsink socket=/opt/docker/input.sockCopy to clipboard

## 视频转换

在三个单独的控制台中运行以下命令以执行 pipeline：

1. Pipeline 1：

    1. 开始视频采集。
    2. 转换分辨率。
    3. 将数据发送到套接字。

        gst-launch-1.0 -e qtisocketsrc socket=/opt/docker/output.sock ! video/x-raw\(memory:GBM\),format=NV12,width=1280,height=720,framerate=30/1,compression=ubwc,interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=5 output-io-mode=5 ! h264parse ! mp4mux ! queue ! filesink location=/opt/docker_video_transformed.mp4Copy to clipboard
2. Pipeline 2：
    1. 在 docker 容器内运行。
    2. 从输入套接字读取。
    3. 将数据传递到输出套接字。

        docker run -v /opt/docker:/opt -v /usr/lib/gstreamer-1.0/libqtisocketsrc.so:/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsrc.so -v /usr/lib/gstreamer-1.0/libqtisocketsink.so:/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsink.so -ti gst-image-kodiak /bin/bash -c "gst-launch-1.0 -e qtisocketsrc socket=/opt/input.sock ! qtisocketsink socket=/opt/output.sock"Copy to clipboard
3. Pipeline 3：
    1. 从输出套接字读取。
    2. 对视频流数据进行编码。
    3. 将数据保存到文件中。

        export XDG_RUNTIME_DIR=/dev/socket/weston && export WAYLAND_DISPLAY=wayland-1Copy to clipboard

        gst-launch-1.0 -e qtiqmmfsrc name=camsrc video_0::type=preview ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1,compression=ubwc ! queue ! qtivtransform ! video/x-raw\(memory:GBM\),format=NV12,width=1280,height=720,framerate=30/1 ! queue ! qtisocketsink socket=/opt/docker/input.sockCopy to clipboard

## 目标检测

在三个单独的控制台中运行以下命令以执行 pipeline：

1. Pipeline 1：

    1. 开始视频采集。
    2. 执行目标检测。
    3. 用于 [qtioverlay](https://docs.qualcomm.com/doc/80-70014-50Y/topic/qtioverlay.html) 在视频上应用边界框。
    4. 将数据发送到套接字。

        gst-launch-1.0 -e qtisocketsrc socket=/opt/docker/output.sock ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1,compression=ubwc,interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=5 output-io-mode=5 ! h264parse ! mp4mux ! queue ! filesink location=/opt/docker_video_detect.mp4Copy to clipboard
2. Pipeline 2：
    1. 在 docker 容器内运行。
    2. 从输入套接字读取。
    3. 将数据传递到输出套接字。

        docker run -v /opt/docker:/opt -v /usr/lib/gstreamer-1.0/libqtisocketsrc.so:/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsrc.so -v /usr/lib/gstreamer-1.0/libqtisocketsink.so:/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsink.so -ti gst-image-kodiak /bin/bash -c "gst-launch-1.0 -e qtisocketsrc socket=/opt/input.sock ! qtisocketsink socket=/opt/output.sock"Copy to clipboard
3. Pipeline 3：
    1. 从输出套接字读取。
    2. 对视频流数据进行编码。
    3. 将数据保存到文件中。

        export XDG_RUNTIME_DIR=/dev/socket/weston && export WAYLAND_DISPLAY=wayland-1Copy to clipboard

        gst-launch-1.0 -e qtiqmmfsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1,compression=ubwc ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! qtisocketsink socket=/opt/docker/input.sock split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=gpu model=/opt/yolov5m-320x320-int8.tflite ! queue ! qtimlvdetection threshold=45.0 results=10 module=yolov5 labels=/opt/yolov5m.labels constants="YoloV5,q-offsets=<3.0>,q-scales=<0.005047998391091824>;" ! text/x-raw ! queue ! metamux.Copy to clipboard

**Parent Topic:** [多媒体用例](https://docs.qualcomm.com/doc/80-70014-50Y/topic/multimedia-use-cases.html)

Last Published: Nov 11, 2025

[Previous Topic
单摄像头流和套接字用例](https://docs.qualcomm.com/bundle/publicresource/80-70014-50Y/topics/socketsrc-and-socketsink-use-case.md) [Next Topic
GStreamer 守护进程](https://docs.qualcomm.com/bundle/publicresource/80-70014-50Y/topics/gstreamer-daemon.md)