媒体传输 · 编码
1. 模块概述
- 主要功能:视频编码模块,将原始 YUV/RGB 视频帧压缩为 H.264/H.265/JPEG 码流,用于网络传输或存储,大幅降低带宽和存储需求
- 规格或特性:
- 支持编码格式:H.264 (AVC)、H.265 (HEVC)、MJPEG
- 支持分辨率:最高 4K (3840x2160)
- 支持帧率:最高 30fps(1080p)、60fps(720p)
- 码率控制:CBR(固定码率)、VBR(可变码率)
- 硬件加速:使用硬件编码器,低功耗高性能
- 相关目录结构:基于 MPP 框架,参考 多媒体 · MPP
2. 环境准备
前置条件
- 依赖与外部资源:MPP 库、硬件编码器驱动
- 环境变量与初始化:同 MPP
- 硬件与连接:SPACEMIT K3 芯片或兼容平台
- 工具与权限:访问编码器设备节点需相应权限
构建编译
-
获取代码:
SDK 源码获取和基础编译环境配置参考2.3-构建编译。完成 SDK 初始化后,回到本文继续执行
后续命令默认在 spacemit_robot SDK 根目录执行。
-
本模块编译:参考 多媒体 · MPP 构建编译
3. 示例使用(从 0 跑通)
3.1 命令行编码测试(文件到文件)
使用 MPP 自带的 test_venc_file 工具,将 YUV 原始帧编码为 H.264/H.265 码流,快速验证编码功能。
前置:已编译 MPP,开发板已开机并通过 SSH 登录
步骤 1:SSH 登录开发板
ssh root@<开发板IP>
# 密码:root
步骤 2:进入到SDK构建目录,拷贝相关测试文件,然后进入测试程序目录
cd spacemit_robot
cp components/multimedia/mpp/test/assets/vi_phy0_last_frame.yuv output/build/cmake/pkgs/components_multimedia_mpp/test/
cd output/build/cmake/pkgs/components_multimedia_mpp/test
步骤 3:运行 H.264 编码
./test_venc_file ./vi_phy0_last_frame.yuv 1920 1080 ./enc_out.h264 h264 1
参数说明:
| 参数 | 含义 |
|---|---|
./vi_phy0_last_frame.yuv | 输入 YUV(NV12)文件路径 |
1920 | 图像宽度 |
1080 | 图像高度 |
./enc_out.h264 | 输出码流文件路径 |
h264 | 编码格式(支持 h264、h265) |
1 | 编码帧数 |
预期现象:
[INFO] VENC file test: ./vi_phy0_last_frame.yuv 1920x1080 -> ./enc_out.h264 (H.264), frames=1
[INFO] encoded frame 0: size=63778 key=0 pts=0
[INFO] done, encoded 1 frame(s)
编码完成后在当前目录生成 enc_out.h264 文件。
步骤 4:验证输出码流
将 enc_out.h264 拷贝到 PC 上,使用 ffplay 播放验证:
ffplay enc_out.h264
3.2 H.264 编码 API 调用示例
以下为使用 MPP API 进行编码的代码示例,展示核心调用流程。
步骤 1:创建编码器上下文
#include "venc.h"
MppVencCtx *ctx = venc_ctx_create();
venc_ctx_init(ctx);
步骤 2:设置编码参数
MppVencPara para;
para.eCodecType = MPP_CODEC_H264;
para.u32Width = 1920;
para.u32Height = 1080;
para.u32Fps = 30;
para.u32Bitrate = 4000000; // 4Mbps
venc_ctx_set_param(ctx, VENC_CMD_SET_PARA, ¶);
步骤 3:送入原始帧并编码
MppData input_frame;
// 填充 input_frame 数据
venc_ctx_encode(ctx, &input_frame);
步骤 4:获取编码后的码流
MppData output_stream;
venc_ctx_get_output_stream(ctx, &output_stream);
// 处理 output_stream(保存或发送)
venc_ctx_return_output_stream(ctx, &output_stream);
预期现象:输出 H.264 码流,可用播放器验证
4. 应用开发
-
对外 API 或接口形态:
- 头文件:
include/venc.h - 库名:
libmpp_venc.so - 主要 API:
venc_ctx_create()- 创建编码器上下文venc_ctx_init()- 初始化编码器venc_ctx_set_param()- 设置编码参数venc_ctx_encode()- 编码一帧venc_ctx_get_output_stream()- 获取输出码流venc_ctx_destroy()- 销毁编码器
- 头文件:
-
调用方式与注意点:
- 初始化顺序:create → init → set_param → encode
- 线程安全:单个上下文不支持多线程并发
- 内存管理:输入帧需使用 MPP 内存分配接口
- 码流释放:获取码流后必须调用
return_output_stream()释放 - 参数调整:运行时可动态调整码率、帧率等参数
-
参考 demo 或示例路径:
mpp/test/test_venc_file.c、mpp/mpi/venc/venc_api.c、mpp/sample/
5. 调试指南
- 码流验证:使用
ffplay或vlc播放输出码流验证正确性 - 性能分析:统计编码耗时,计算实际帧率和码率
- 质量调优:调整 QP 参数、码率控制模式优化画质
6. 常见问题
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 编码初始化失败 | 硬件编码器插件未加载 | 检查 libv4l2_linlonv5v7_codec2.so是否存在 |
| 编码帧率低 | 输入帧率过高或分辨率过大 | 降低分辨率或帧率 |
| 码流无法播放 | 编码参数错误或码流损坏 | 检查编码参数,使用标准测试帧 |
| 画质差 | 码率过低 | 提高目标码率 |
附录:性能与测试数据
| 指标 | 数值 | 测试条件 |
|---|---|---|
| H.264 编码性能 | 1080p@30fps | 硬件编码,码率 4Mbps |
| H.265 编码性能 | 1080p@30fps | 硬件编码,码率 2Mbps |
| 编码延迟 | <50ms | 1080p 单帧 |
测试方法:使用 MPP 测试程序,SPACEMIT K3 平台,Linux 内核 5.10。测试命令:
cd spacemit_robot
cp components/multimedia/mpp/test/assets/1920x1080.jpg output/build/cmake/pkgs/components_multimedia_mpp/test/
cd output/build/cmake/pkgs/components_multimedia_mpp/test
./test_venc_file ./vi_phy0_last_frame.yuv 1920 1080 ./enc_out.h264 h264 1