Three笔记 2023-06-12 10:47 采纳率: 66.7%
浏览 130
已结题

rk3588板子mpp编码mpp_init失败

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

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-12 12:07
    关注
    • 这篇博客: 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解码全流程,各位可以根据实际情况组织代码,多路视频的情况下,要做好多线程并发处理。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月12日
  • 创建了问题 6月12日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真