视频
辅助头文件:
#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