视频

[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 布局(视硬件与管线而定)

服务接口

函数

编码器

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