-
Notifications
You must be signed in to change notification settings - Fork 1
MPP_EncoderContext
SweerItTer edited this page Feb 21, 2026
·
4 revisions
MppEncoderContext 是 utilsCore MPP 模块的核心类,提供 Rockchip MPP 编码器的完整上下文管理,包括初始化、配置、重配置等。
- MppCtx/MppApi/MppEncCfg 的 RAII 生命周期管理
- 编码器的初始化、配置、重配置
- 支持动态修改编码参数(分辨率、码率、FPS、编码格式等)
- Ffmpeg 兼容性验证和自动修复
- 视频录制
- 实时流编码
- 图像压缩
- 多格式编码
- 依赖: Rockchip MPP 库
- 被依赖: MppEncoderCore, JpegEncoder 等模块
MppEncoderContext 是编码器上下文的封装类,提供:
- 完整的 MPP 上下文生命周期管理
- 40+ 个编码配置参数
- 静态配置验证和修复方法
- 预设配置生成器
- RAII: 自动管理 MPP 资源
- Builder 模式: 通过 Config 结构体配置参数
编码器类型定义。
enum class CodingType {
H264 = MPP_VIDEO_CodingAVC, // H.264 / AVC
H265 = MPP_VIDEO_CodingHEVC, // H.265 / HEVC
VP8 = MPP_VIDEO_CodingVP8, // VP8
MJPEG= MPP_VIDEO_CodingMJPEG // MJPEG
};编码器配置结构体,用于初始化和动态重置编码器参数。
CodingType codec_type = CodingType::H264; // 编码格式
int prep_width = 1920; // 输入图像宽度
int prep_height = 1080; // 输入图像高度
int rc_fps_out_num = 30; // 输出帧率
int rc_bps_target = 4 * 1024 * 1024; // 目标码率(bps)
int rc_gop = 60; // GOP 长度int prep_hor_stride = 0; // 水平 stride, 0 为自动对齐
int prep_ver_stride = 0; // 垂直 stride
MppFrameFormat prep_format = MPP_FMT_YUV420SP; // 输入像素格式, 默认 NV12
int prep_rotation = 0; // 旋转角度, 支持 0/90/180/270
bool prep_mirroring = false; // 镜像int rc_mode = MPP_ENC_RC_MODE_VBR; // CBR/VBR/FIXQP
int rc_bps_min = 0; // 最小码率, 0 为自动
int rc_bps_max = 0; // 最大码率
int rc_fps_in_num = 30; // 输入帧率
int rc_fps_in_denorm = 1; // 输入帧率分母
int rc_fps_out_denorm = 1; // 输出帧率分母
int rc_fps_in_flex = 0; // 输入帧率自适应
int rc_fps_out_flex = 0; // 输出帧率自适应
int rc_qp_init = -1; // 初始 QP, 仅 FIXQP 模式有效
int rc_qp_min_i = 0; // I 帧最小 QP
int rc_qp_max_i = 0; // I 帧最大 QP
int rc_qp_min = 0; // P 帧最小 QP
int rc_qp_max = 0; // P 帧最大 QP
int rc_qp_ip = 2; // I/P帧QP差值int h264_profile = 77; // H.264 profile, 默认 baseline
int h264_level = 30; // H.264 level
int hevc_profile = 1; // H.265 主 profile
int hevc_level = 30; // H.265 levelint jpeg_q_factor = 90; // JPEG 默认质量因子, 推荐范围 70–95
int jpeg_qf_min = 1; // JPEG 最低质量因子
int jpeg_qf_max = 99; // JPEG 最高质量因子int sei_mode = MPP_ENC_SEI_MODE_ONE_FRAME; // SEI 插入模式
int header_mode = MPP_ENC_HEADER_MODE_EACH_IDR; // SPS/PPS 输出策略int split_mode = 0; // Slice 分割模式
int split_arg = 0; // Slice 参数
int split_out = 0; // Slice 输出
int roi_enable = 0; // 启用 ROI
int osd_enable = 0; // 启用 OSD
int osd_mode = MPP_ENC_OSD_PLT_TYPE_DEFAULT; // OSD 模式
int user_data_enable = 0; // 是否写入 user-data SEI
int rc_force_idr_interval = 0; // 0 = 不强制, >0 = 每 N 帧强制生成 I 帧
bool rc_low_delay = false; // 是否开启低延时模式
int rc_max_reenc_times = 1; // 单帧最大重编码次数
int rc_super_mode = 0; // 超大帧处理策略: 0=无策略, 1=丢弃, 2=重编码
int rc_super_i_thd = 0; // 超大 I 帧阈值, 字节数
int rc_super_p_thd = 0; // 超大 P 帧阈值, 字节数
int rc_max_i_prop = 30; // 最大 I/P 比例
int rc_min_i_prop = 10; // 最小 I/P 比例
int rc_init_ip_ratio = 160; // 初始 I/P 比例
bool hier_qp_enable = false; // 是否启用 QP 分层
int hier_frame_num[4] = {0}; // 每层帧数, 层数最多 4
int hier_qp_delta[4] = {0}; // 每层 QP 相对第0层 P 帧的偏移
bool rc_debreath_en = false; // 是否开启去呼吸效应
int rc_debreath_strength = 0; // 去呼吸强度, [0,35]
int rc_drop_mode = 0; // 0=关闭, 1=正常丢帧, 2=pskip构造
int rc_drop_thd = 20; // 丢帧阈值
int rc_drop_gap = 1; // 最大允许连续丢帧数
int rc_stats_time = 3; // 瞬时码率统计时间, 单位秒
bool cabac_enable = false; // 是否启用 CABAC
int cabac_idc = 0; // CABAC 初始化 ID, 0~2
int rc_poc_type = 0; // pic_order_cnt_type
int rc_log2_max_poc_lsb = 0; // log2_max_pic_order_cnt_lsb_minus4
int rc_log2_max_frm_num = 0; // log2_max_frame_num_minus4
bool rc_prefix_mode = false; // 是否在 SEI 前插入 prefix nal
int rc_base_layer_pid = 0; // 基准层优先级ID
int rc_color_range_override = -1; // -1: 默认, 0: 未指定, 1: MPEG, 2: JPEG
void* user_ext = nullptr; // 用户自定义扩展指针explicit MppEncoderContext(const Config &cfg);
~MppEncoderContext();参数说明:
-
cfg(输入): 用户定义的编码配置
返回值: 无
所有权归属:
- MppEncoderContext 拥有 MppCtx, MppApi, MppEncCfg 的所有权
注意事项:
- 构造时会初始化 MPP 上下文
- 失败时抛出异常
- 析构时自动清理资源
使用例程:
MppEncoderContext::Config cfg;
cfg.codec_type = MppEncoderContext::CodingType::H264;
cfg.prep_width = 1920;
cfg.prep_height = 1080;
cfg.rc_fps_out_num = 30;
cfg.rc_bps_target = 4 * 1024 * 1024;
MppEncoderContext ctx(cfg);bool resetConfig(const Config &cfg);参数说明:
-
cfg(输入): 新配置
返回值:
-
true: 重置成功 -
false: 重置失败
所有权归属:
- 无所有权转移
注意事项:
- 会触发 MPP 内部重新配置编码参数
- 不会销毁 ctx
- 可以动态修改编码参数
使用例程:
MppEncoderContext ctx(cfg);
// 修改码率
cfg.rc_bps_target = 8 * 1024 * 1024;
ctx.resetConfig(cfg);MppCtx ctx() const;参数说明: 无
返回值: MppCtx 指针
所有权归属:
- 只读访问
注意事项:
- 用于传递给 MppEncoderCore
MppApi* api() const;参数说明: 无
返回值: MppApi 指针
所有权归属:
- 只读访问
注意事项:
- 用于调用 MPP API
MppEncCfg encCfg() const;参数说明: 无
返回值: MppEncCfg 句柄
所有权归属:
- 只读访问
注意事项:
- 用于传递给 MppEncoderCore
const Config* getmCfg() const;参数说明: 无
返回值: 当前配置指针
所有权归属:
- 只读访问
注意事项:
- 返回指向 mCurCfg 的指针
static void validateForFfmpeg(const Config& cfg);参数说明:
-
cfg(输入): 要验证的配置
返回值: 无
所有权归属:
- 无所有权转移
注意事项:
- 检查关键参数以确保生成的视频流可以被 ffmpeg 正确转换为 MP4
- 如果配置有问题,会输出警告信息到 stderr
- 不修改配置
检查项:
- 像素格式是否为 NV12 或 YUV420P
- 色彩范围是否为 MPEG (1)
- 编码类型是否为 H264 或 H265
- H264 profile 是否为 Main (77) 或 High (100)
使用例程:
MppEncoderContext::Config cfg;
// ... 设置配置 ...
MppEncoderContext::validateForFfmpeg(cfg);
// 输出:
// [MppEncoderContext] WARNING: Format 24 may not be optimal for ffmpeg. Use MPP_FMT_YUV420SP (NV12).static void fixForFfmpeg(Config& cfg);参数说明:
-
cfg(输入/输出): 要修复的配置引用
返回值: 无
所有权归属:
- 无所有权转移
注意事项:
- 自动设置关键参数以避免 ffmpeg 转换时的颜色问题
- 直接修改传入的 Config 引用
- 根据分辨率自动调整 level
修复项:
- 强制 NV12 格式 (MPP_FMT_YUV420SP)
- 强制 MPEG 色彩范围 (rc_color_range_override = 1)
- 确保 H264/H265 编码类型
- 设置合适的 H264 profile
- 根据分辨率自动设置 level
使用例程:
MppEncoderContext::Config cfg;
cfg.codec_type = MppEncoderContext::CodingType::H264;
cfg.prep_width = 1920;
cfg.prep_height = 1080;
// 自动修复以获得最佳 ffmpeg 兼容性
MppEncoderContext::fixForFfmpeg(cfg);
// 使用修复后的配置
MppEncoderContext ctx(cfg);预设配置生成器,提供常用场景的配置模板。
inline static MppEncoderContext::Config defconfig_video_recording(
int width, int height, int fps = 30, int bitrate_mbps = 4);参数说明:
-
width(输入): 图像宽度 -
height(输入): 图像高度 -
fps(输入): 帧率 -
bitrate_mbps(输入): 码率,0 表示自动计算
返回值: 视频录制配置
使用例程:
auto cfg = DefaultConfigs::defconfig_video_recording(1920, 1080, 30, 8);
MppEncoderContext ctx(cfg);inline static MppEncoderContext::Config createJpegConfig(
uint32_t width, uint32_t height, MppFrameFormat format = MPP_FMT_YUV420SP, int quality = 8);参数说明:
-
width(输入): 图像宽度 -
height(输入): 图像高度 -
format(输入): 像素格式 -
quality(输入): 质量因子 0-10
返回值: JPEG 编码器配置
使用例程:
auto cfg = DefaultConfigs::createJpegConfig(1920, 1080, MPP_FMT_YUV420SP, 8);
MppEncoderContext ctx(cfg);inline static MppEncoderContext::Config defconfig_480p_video(int fps = 120);使用例程:
auto cfg = DefaultConfigs::defconfig_480p_video(60);
MppEncoderContext ctx(cfg);inline static MppEncoderContext::Config defconfig_720p_video(int fps = 60);使用例程:
auto cfg = DefaultConfigs::defconfig_720p_video(60);
MppEncoderContext ctx(cfg);inline static MppEncoderContext::Config defconfig_1080p_video(int fps = 60);使用例程:
auto cfg = DefaultConfigs::defconfig_1080p_video(30);
MppEncoderContext ctx(cfg);inline static MppEncoderContext::Config defconfig_4k_video(int fps = 30);使用例程:
auto cfg = DefaultConfigs::defconfig_4k_video(30);
MppEncoderContext ctx(cfg);inline static MppEncoderContext::Config defconfig_2k_video(int fps = 30);使用例程:
auto cfg = DefaultConfigs::defconfig_2k_video(30);
MppEncoderContext ctx(cfg);MppEncoderContext::Config cfg;
cfg.codec_type = MppEncoderContext::CodingType::H264;
cfg.prep_width = 1920;
cfg.prep_height = 1080;
cfg.rc_fps_out_num = 30;
cfg.rc_bps_target = 4 * 1024 * 1024;
MppEncoderContext ctx(cfg);
// 传递给 MppEncoderCore
auto encoder = std::make_shared<MppEncoderCore>(cfg, 0);auto cfg = DefaultConfigs::defconfig_1080p_video(30);
MppEncoderContext ctx(cfg);auto cfg = DefaultConfigs::defconfig_video_recording(1920, 1080, 30, 8);
// 验证配置
MppEncoderContext::validateForFfmpeg(cfg);
// 自动修复
MppEncoderContext::fixForFfmpeg(cfg);
MppEncoderContext ctx(cfg);auto cfg = DefaultConfigs::createJpegConfig(1920, 1080, MPP_FMT_YUV420SP, 8);
MppEncoderContext ctx(cfg);auto cfg = DefaultConfigs::defconfig_1080p_video(30);
MppEncoderContext ctx(cfg);
// 修改码率
cfg.rc_bps_target = 8 * 1024 * 1024;
ctx.resetConfig(cfg);-
类名: 是
MppEncoderContext,不是EncoderContext - Config 字段: 有 40+ 个配置参数,大部分有合理的默认值
- RAII: 析构时自动清理 MPP 资源
-
Ffmpeg 兼容: 使用
fixForFfmpeg()自动修复配置 -
预设配置: 优先使用
DefaultConfigs命名空间的预设配置 -
动态重配置: 使用
resetConfig()动态修改参数 - 质量因子: JPEG quality 参数范围是 0-10(内部转换为 0-100)
-
码率计算: 在
defconfig_video_recording()等预设配置中,当bitrate_mbps > 0时使用指定码率(bitrate_mbps * 1024 * 1024),当bitrate_mbps <= 0时使用 MPP 官方默认公式计算:width * height / 8 * (fps / 1)
- MppEncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MPP 模块总览
主页
API 文档
DMA 模块
DRM 模块
- DRM 模块总览
- DeviceController - DRM 设备控制器
- DrmLayer - DRM 图层管理
- PlanesCompositor - DRM 平面合成器
- DrmBpp - DRM 格式定义
NET 模块
- NET 模块总览
- TcpServer - TCP 服务器
- SocketConnection - Socket 连接管理
- CommandHandler - 命令处理器
- DataPacket - 数据包
V4L2 模块
- V4L2 模块总览
- CameraController - V4L2 摄像头控制器
- Frame - V4L2 帧数据结构
- FormatTool - V4L2 格式工具
- Exception - V4L2 异常类
V4L2Param 模块
- V4L2Param 模块总览
- ParamControl - 参数控制
- ParamLogger - 参数日志
- ParamProcessor - 参数处理器
RGA 模块
- RGA 模块总览
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- FormatTool - RGA 格式工具
MPP 模块
- MPP 模块总览
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MppResourceGuard - MPP 资源守护
- FileTools - 文件工具
- FormatTool - 格式工具
Sys 模块
- Sys 模块总览
- CpuMonitor - CPU 监控器
- MemoryMonitor - 内存监控器
- Base - 基础类
Mouse 模块
- Mouse 模块总览
- Watcher - 鼠标监视器
Utils 模块
- Utils 模块总览
- AsyncThreadPool - 异步线程池
- ConcurrentQueue - 并发队列
- FdWrapper - 文件描述符包装器
- FenceWatcher - 围栏监视器
- FixedSizePool - 固定大小对象池
- Logger - 日志记录器
- ObjectsPool - 对象池
- OrderedQueue - 有序队列
- ProgressBar - 进度条
- SafeQueue - 安全队列
- SharedBufferState - 共享缓冲区状态
- SimpleVariant - 简单变体类型
- ThreadPauser - 线程暂停器
- ThreadUtils - 线程工具
- Types - 类型定义
- UdevMonitor - Udev 监视器