跳到主要内容

媒体传输 · 编码

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编码格式(支持 h264h265
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, &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.cmpp/mpi/venc/venc_api.cmpp/sample/

5. 调试指南

  • 码流验证:使用 ffplayvlc 播放输出码流验证正确性
  • 性能分析:统计编码耗时,计算实际帧率和码率
  • 质量调优:调整 QP 参数、码率控制模式优化画质

6. 常见问题

现象可能原因处理
编码初始化失败硬件编码器插件未加载检查 libv4l2_linlonv5v7_codec2.so是否存在
编码帧率低输入帧率过高或分辨率过大降低分辨率或帧率
码流无法播放编码参数错误或码流损坏检查编码参数,使用标准测试帧
画质差码率过低提高目标码率

附录:性能与测试数据

指标数值测试条件
H.264 编码性能1080p@30fps硬件编码,码率 4Mbps
H.265 编码性能1080p@30fps硬件编码,码率 2Mbps
编码延迟<50ms1080p 单帧

测试方法:使用 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