rk3588板子mpp编码mpp_init失败

rk3588板子mpp编码初始化mpp_init失败
网上的示例都试了一遍,每次都是在mpp_init失败,返回值-1

  • 这篇博客: 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解码全流程,各位可以根据实际情况组织代码,多路视频的情况下,要做好多线程并发处理。

你把代码发过来看一下