视频

[English]

  • 组件注册表: espressif/brookesia_service_video

  • 辅助头文件: #include "brookesia/service_helper/media/video.hpp"

  • 辅助类: esp_brookesia::service::helper::Video

概述

brookesia_service_video 是为 ESP-Brookesia 生态系统提供的视频服务,主要包括:

  • 视频编码:将摄像头等采集源编码为多种压缩或原始格式(分辨率、帧率、格式可分别配置)。

  • 视频解码:将 H.264、MJPEG 等压缩码流解码为常用 RGB、YUV 等显示或后处理格式。

功能特性

编码器

视频编码服务的输入来自 本地视频设备,默认设备路径为 /dev/video0,可在 Kconfig 中配置默认路径前缀与数量。

视频编码服务可将一路输出配置为下列类型之一(每路可单独指定分辨率与帧率):

类型

说明

H.264

常用网络与存储压缩格式

MJPEG

逐帧 JPEG 类压缩

RGB565 / RGB888 / BGR888

RGB 类格式

YUV420 / YUV422 / O_UYY_E_VYY

YUV 类格式

警告

目前暂不支持多路输出。

解码器

解码服务的输入为压缩码流格式,输出为像素格式,可按业务分别配置。常见取值如下:

输入(压缩格式)

格式

说明

H.264

常用网络与存储视频压缩格式

MJPEG

逐帧 JPEG 类压缩码流

输出(像素格式)

格式

说明

RGB565(大端 / 小端)

16 位 RGB,适合部分屏驱与显存布局

RGB888 / BGR888

24 位 RGB / BGR,常用于显示与图像处理

YUV420P / YUV422P

平面 YUV,便于视频处理管线

YUV422 / UYVY422

打包 YUV,常见于采集与显示链路

O_UYY_E_VYY

特定打包 YUV 布局(视硬件与管线而定)

显示 DataFlow 集成

配置显示 sink 后,编码器和解码器会通过与 provider 无关的显示 DataFlow 操作发现输出、选择源并提交帧,使视频服务不依赖具体的显示 provider 实现。

服务接口

函数

编码器

Open
描述

Open the encoder with config. If display is set, sink format is derived from the selected Display output when Max; width/height are filled from the output area when zero. When stream mode is enabled, frames are emitted automatically through StreamSinkFrameReady; FetchFrame is only for non-stream mode.

执行要求
  • 是否需要调度器: 需要

参数
  • Config

    • 类型: Object

    • 是否必填: 必填

    • 描述: Encoder config. Example: {"sinks":[{"format":"H264","width":320,"height":240,"fps":30},{"format":"MJPEG","width":320,"height":240,"fps":15}],"enable_stream_mode":true,"source":{"device_path":"/dev/video0","fixed_format":"RGB565","fixed_width":320,"fixed_height":240,"v4l2_buffer_count":2},"display":{"output_name":"Output0","source_name":"Video","source_role":"video","x":0,"y":0,"draw_timeout_ms":1000,"publish_sink_event":false,"activate_source":true,"sink_index":0}}

Schema JSON
展开查看 JSON

{
  "name": "Open",
  "description": "Open the encoder with config. If `display` is set, sink format is derived from the selected Display output when `Max`; width/height are filled from the output area when zero. When stream mode is enabled, frames are emitted automatically through `StreamSinkFrameReady`; `FetchFrame` is only for non-stream mode.",
  "require_scheduler": true,
  "default_timeout_ms": 2000,
  "parameters": [
    {
      "name": "Config",
      "description": "Encoder config. Example: {\"sinks\":[{\"format\":\"H264\",\"width\":320,\"height\":240,\"fps\":30},{\"format\":\"MJPEG\",\"width\":320,\"height\":240,\"fps\":15}],\"enable_stream_mode\":true,\"source\":{\"device_path\":\"/dev/video0\",\"fixed_format\":\"RGB565\",\"fixed_width\":320,\"fixed_height\":240,\"v4l2_buffer_count\":2},\"display\":{\"output_name\":\"Output0\",\"source_name\":\"Video\",\"source_role\":\"video\",\"x\":0,\"y\":0,\"draw_timeout_ms\":1000,\"publish_sink_event\":false,\"activate_source\":true,\"sink_index\":0}}",
      "type": "Object",
      "required": true,
      "default_value": null
    }
  ],
  "return_value": null
}
CLI 命令
svc_call VideoEncoder0 Open {"Config":null}
Close
描述

Close encoder.

执行要求
  • 是否需要调度器: 不需要

参数
  • 无。

Schema JSON
展开查看 JSON

{
  "name": "Close",
  "description": "Close encoder.",
  "require_scheduler": false,
  "default_timeout_ms": null,
  "parameters": [],
  "return_value": null
}
CLI 命令
svc_call VideoEncoder0 Close
Start
描述

Start encoder.

执行要求
  • 是否需要调度器: 需要

参数
  • 无。

Schema JSON
展开查看 JSON

{
  "name": "Start",
  "description": "Start encoder.",
  "require_scheduler": true,
  "default_timeout_ms": null,
  "parameters": [],
  "return_value": null
}
CLI 命令
svc_call VideoEncoder0 Start
Stop
描述

Stop encoder.

执行要求
  • 是否需要调度器: 不需要

参数
  • 无。

Schema JSON
展开查看 JSON

{
  "name": "Stop",
  "description": "Stop encoder.",
  "require_scheduler": false,
  "default_timeout_ms": null,
  "parameters": [],
  "return_value": null
}
CLI 命令
svc_call VideoEncoder0 Stop
FetchFrame
描述

Fetch an encoder output frame and emit FetchSinkFrameReady. Only available in non-stream mode; stream mode emits StreamSinkFrameReady automatically.

执行要求
  • 是否需要调度器: 需要

参数
  • SinkIndex

    • 类型: Number

    • 是否必填: 可选

    • 默认值: 0E0

    • 描述: Sink index.

Schema JSON
展开查看 JSON

{
  "name": "FetchFrame",
  "description": "Fetch an encoder output frame and emit `FetchSinkFrameReady`. Only available in non-stream mode; stream mode emits `StreamSinkFrameReady` automatically.",
  "require_scheduler": true,
  "default_timeout_ms": null,
  "parameters": [
    {
      "name": "SinkIndex",
      "description": "Sink index.",
      "type": "Number",
      "required": false,
      "default_value": 0.0
    }
  ],
  "return_value": null
}
CLI 命令
svc_call VideoEncoder0 FetchFrame {"SinkIndex":null}

解码器

Open
描述

Open the decoder with config. If display is set, sink format is derived from the selected Display output; width/height are used when non-zero, otherwise filled from the output area.

执行要求
  • 是否需要调度器: 需要

参数
  • Config

    • 类型: Object

    • 是否必填: 必填

    • 描述: Decoder config. Example: {"width":0,"height":0,"source_format":"MJPEG","sink_format":"Max","enable_stream_mode":true,"enable_hw_acceleration":true,"display":{"output_name":"Output0","source_name":"Video","source_role":"video","x":0,"y":0,"draw_timeout_ms":1000,"publish_sink_event":false}}

Schema JSON
展开查看 JSON

{
  "name": "Open",
  "description": "Open the decoder with config. If `display` is set, sink format is derived from the selected Display output; width/height are used when non-zero, otherwise filled from the output area.",
  "require_scheduler": true,
  "default_timeout_ms": null,
  "parameters": [
    {
      "name": "Config",
      "description": "Decoder config. Example: {\"width\":0,\"height\":0,\"source_format\":\"MJPEG\",\"sink_format\":\"Max\",\"enable_stream_mode\":true,\"enable_hw_acceleration\":true,\"display\":{\"output_name\":\"Output0\",\"source_name\":\"Video\",\"source_role\":\"video\",\"x\":0,\"y\":0,\"draw_timeout_ms\":1000,\"publish_sink_event\":false}}",
      "type": "Object",
      "required": true,
      "default_value": null
    }
  ],
  "return_value": null
}
CLI 命令
svc_call VideoDecoder0 Open {"Config":null}
Close
描述

Close decoder.

执行要求
  • 是否需要调度器: 需要

参数
  • 无。

Schema JSON
展开查看 JSON

{
  "name": "Close",
  "description": "Close decoder.",
  "require_scheduler": true,
  "default_timeout_ms": null,
  "parameters": [],
  "return_value": null
}
CLI 命令
svc_call VideoDecoder0 Close
Start
描述

Start decoder.

执行要求
  • 是否需要调度器: 需要

参数
  • 无。

Schema JSON
展开查看 JSON

{
  "name": "Start",
  "description": "Start decoder.",
  "require_scheduler": true,
  "default_timeout_ms": null,
  "parameters": [],
  "return_value": null
}
CLI 命令
svc_call VideoDecoder0 Start
Stop
描述

Stop decoder.

执行要求
  • 是否需要调度器: 需要

参数
  • 无。

Schema JSON
展开查看 JSON

{
  "name": "Stop",
  "description": "Stop decoder.",
  "require_scheduler": true,
  "default_timeout_ms": null,
  "parameters": [],
  "return_value": null
}
CLI 命令
svc_call VideoDecoder0 Stop
FeedFrame
描述

Feed a decoder input frame.

执行要求
  • 是否需要调度器: 需要

参数
  • Frame

    • 类型: RawBuffer

    • 是否必填: 必填

    • 描述: Frame data.

Schema JSON
展开查看 JSON

{
  "name": "FeedFrame",
  "description": "Feed a decoder input frame.",
  "require_scheduler": true,
  "default_timeout_ms": null,
  "parameters": [
    {
      "name": "Frame",
      "description": "Frame data.",
      "type": "RawBuffer",
      "required": true,
      "default_value": null
    }
  ],
  "return_value": null
}
CLI 命令
svc_call VideoDecoder0 FeedFrame {"Frame":null}

事件

编码器

StreamSinkFrameReady
描述

Emitted when an encoder stream frame is ready. Stream mode only.

执行要求
  • 是否需要调度器: 不需要

参数
  • SinkIndex

    • 类型: Number

    • 描述: Sink index.

  • SinkInfo

    • 类型: Object

    • 描述: Sink info. Example: {"format":"H264","width":320,"height":240,"fps":30}

  • Frame

    • 类型: RawBuffer

    • 描述: Encoded frame data.

Schema JSON
展开查看 JSON

{
  "name": "StreamSinkFrameReady",
  "description": "Emitted when an encoder stream frame is ready. Stream mode only.",
  "require_scheduler": false,
  "items": [
    {
      "name": "SinkIndex",
      "description": "Sink index.",
      "type": "Number"
    },
    {
      "name": "SinkInfo",
      "description": "Sink info. Example: {\"format\":\"H264\",\"width\":320,\"height\":240,\"fps\":30}",
      "type": "Object"
    },
    {
      "name": "Frame",
      "description": "Encoded frame data.",
      "type": "RawBuffer"
    }
  ]
}
CLI 命令
svc_subscribe VideoEncoder0 StreamSinkFrameReady
FetchSinkFrameReady
描述

Emitted when an encoder fetched frame is ready. Non-stream mode only.

执行要求
  • 是否需要调度器: 不需要

参数
  • SinkIndex

    • 类型: Number

    • 描述: Sink index.

  • SinkInfo

    • 类型: Object

    • 描述: Sink info. Example: {"format":"MJPEG","width":320,"height":240,"fps":15}

  • Frame

    • 类型: RawBuffer

    • 描述: Encoded frame data.

Schema JSON
展开查看 JSON

{
  "name": "FetchSinkFrameReady",
  "description": "Emitted when an encoder fetched frame is ready. Non-stream mode only.",
  "require_scheduler": false,
  "items": [
    {
      "name": "SinkIndex",
      "description": "Sink index.",
      "type": "Number"
    },
    {
      "name": "SinkInfo",
      "description": "Sink info. Example: {\"format\":\"MJPEG\",\"width\":320,\"height\":240,\"fps\":15}",
      "type": "Object"
    },
    {
      "name": "Frame",
      "description": "Encoded frame data.",
      "type": "RawBuffer"
    }
  ]
}
CLI 命令
svc_subscribe VideoEncoder0 FetchSinkFrameReady

解码器

SinkFrameReady
描述

Emitted when a decoder output frame is ready.

执行要求
  • 是否需要调度器: 不需要

参数
  • Width

    • 类型: Number

    • 描述: Decoded frame width.

  • Height

    • 类型: Number

    • 描述: Decoded frame height.

  • Frame

    • 类型: RawBuffer

    • 描述: Decoded frame data.

Schema JSON
展开查看 JSON

{
  "name": "SinkFrameReady",
  "description": "Emitted when a decoder output frame is ready.",
  "require_scheduler": false,
  "items": [
    {
      "name": "Width",
      "description": "Decoded frame width.",
      "type": "Number"
    },
    {
      "name": "Height",
      "description": "Decoded frame height.",
      "type": "Number"
    },
    {
      "name": "Frame",
      "description": "Decoded frame data.",
      "type": "RawBuffer"
    }
  ]
}
CLI 命令
svc_subscribe VideoDecoder0 SinkFrameReady