rk3588板子mpp编码初始化mpp_init失败
网上的示例都试了一遍,每次都是在mpp_init失败,返回值-1
mpp模块封装了内部操作vpu的接口,简化了使用。mpp的使用方法与ffmpeg比较接近,学习起来也不会很复杂。mpp解码流程如下:
1、创建MppCtx以及MppApi
ret = mpp_create(&m_ctx, &m_mpi);
if (ret != MPP_OK)
{
errorf("mpp_create failed\n");
destoryMpp();
return false;
}
mpp是可以多线程使用的,每个线程拥有自己独立的ctx及api
2、设置mpp解码模式
MpiCmd mpi_cmd = MPP_CMD_BASE;
RK_U32 need_split = 1;
mpi_cmd = MPP_DEC_SET_PARSER_SPLIT_MODE;
param = &need_split;
ret = m_mpi->control(m_ctx, mpi_cmd, param);
if (MPP_OK != ret)
{
errorf("m_mpi MPP_DEC_SET_PARSER_SPLIT_MODE err\n");
destoryMpp();
return false;
}
MPP_DEC_SET_PARSER_SPLIT_MODE,自动拼包模式,官方建议模式,该模式下会自动把读取的包拼接完整的帧进行解码。
3、初始化mpp
ret = mpp_init(m_ctx, MPP_CTX_DEC, MPP_VIDEO_CodingAVC);
if (MPP_OK != ret)
{
errorf("mpp_init MPP_CTX_DEC err\n");
destoryMpp();
return false;
}
MPP_CTX_DEC 解码模式
MPP_CTX_ENC 编码模式
MPP_VIDEO_CodingAVC H264流类型
MPP_VIDEO_CodingHEVC H265/HEVC
更多类型见相关宏定义
至此mpp的初始化工作以及完成,接下来就可以进行解码操作了
在解码之前,先了解一下mpp包的基本概念
MppPacket 存储解码前的数据,与AVPacket意思一样,存储H264或者265的视频数据
MppFrame 存储解码后的数据,如YUV
解码的过程实际上,可以把mpp当成一个管道,一端输入packet,一端取frame。
mpp提供了塞数据取数据的接口,有同步异步之分,也有简易高阶接口之分,以适应不同用户群体。
我们选择简单的异步接口decode_put_packet/decode_get_frame
流程如下:
1、AVPacket转MppPacket
转换需要AVPacket中的data,size,pts,dts字段
MPP_RET ret = MPP_OK;
MppPacket packet;
ret = mpp_packet_init(&packet, buffer, size);
if (ret != MPP_OK)
{
mpp_packet_deinit(&packet);
return false;
}
mpp_packet_set_pts(packet, pts);
mpp_packet_set_dts(packet, dts);
mpp_packet_set_length(packet, size + 5);
if (NULL == buffer)
{
mpp_packet_set_eos(packet);
}
2、喂packet
m_mpi->decode_put_packet(m_ctx, packet);
3、另一个线程获取frame
m_mpi->decode_get_frame(m_ctx, &frame);
以上为mpp解码全流程,各位可以根据实际情况组织代码,多路视频的情况下,要做好多线程并发处理。
你把代码发过来看一下