视频

[English]

  • 组件注册表: espressif/brookesia_service_video

  • 辅助头文件: #include "brookesia/service_helper/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.

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

参数
  • 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}

Schema JSON
展开查看 JSON

{
  "name": "Open",
  "description": "Open the encoder with config.",
  "require_scheduler": true,
  "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}",
      "type": "Object",
      "required": true,
      "default_value": null
    }
  ]
}
CLI 命令
svc_call VideoEncoder0 Open {"Config":null}
Close
描述

Close encoder.

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

参数
  • 无。

Schema JSON
展开查看 JSON

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

Start encoder.

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

参数
  • 无。

Schema JSON
展开查看 JSON

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

Stop encoder.

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

参数
  • 无。

Schema JSON
展开查看 JSON

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

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

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

参数
  • 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.",
  "require_scheduler": true,
  "parameters": [
    {
      "name": "SinkIndex",
      "description": "Sink index.",
      "type": "Number",
      "required": false,
      "default_value": 0.0
    }
  ]
}
CLI 命令
svc_call VideoEncoder0 FetchFrame {"SinkIndex":null}

解码器

Open
描述

Open the decoder with config.

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

参数
  • Config

    • 类型: Object

    • 是否必填: 必填

    • 描述: Decoder config. Example: {“width”:320,”height”:240,”source_format”:”H264”,”sink_format”:”RGB565_LE”,”enable_stream_mode”:true,”enable_hw_acceleration”:true}

Schema JSON
展开查看 JSON

{
  "name": "Open",
  "description": "Open the decoder with config.",
  "require_scheduler": true,
  "parameters": [
    {
      "name": "Config",
      "description": "Decoder config. Example: {\"width\":320,\"height\":240,\"source_format\":\"H264\",\"sink_format\":\"RGB565_LE\",\"enable_stream_mode\":true,\"enable_hw_acceleration\":true}",
      "type": "Object",
      "required": true,
      "default_value": null
    }
  ]
}
CLI 命令
svc_call VideoDecoder0 Open {"Config":null}
Close
描述

Close decoder.

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

参数
  • 无。

Schema JSON
展开查看 JSON

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

Start decoder.

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

参数
  • 无。

Schema JSON
展开查看 JSON

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

Stop decoder.

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

参数
  • 无。

Schema JSON
展开查看 JSON

{
  "name": "Stop",
  "description": "Stop decoder.",
  "require_scheduler": true,
  "parameters": []
}
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,
  "parameters": [
    {
      "name": "Frame",
      "description": "Frame data.",
      "type": "RawBuffer",
      "required": true,
      "default_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