rk3588板子mpp编码初始化mpp_init失败
网上的示例都试了一遍,每次都是在mpp_init失败,返回值-1
rk3588板子mpp编码mpp_init失败
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注- 这篇博客: rk3399视频显示_二中的 一、mpp解码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
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解码全流程,各位可以根据实际情况组织代码,多路视频的情况下,要做好多线程并发处理。
解决 无用评论 打赏 举报- 这篇博客: rk3399视频显示_二中的 一、mpp解码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读: