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