0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何设置I帧的QP提高I帧的质量

刘芳 来源:yfdsfqdqd 作者:yfdsfqdqd 2022-08-02 08:03 次阅读

介绍
在有些应用中,发现I帧不够大。MPSoC VCU CtrlSW可以设置每一帧的QP大小。因此,可以通过设置I帧的QP,提高I帧的大小,从而提高I帧的质量。

代码
下面是设置I帧的QP的示例代码。

GOP长度变量
在struct EncoderSink : IFrameSink的定义里添加GOP的成员变量,记录GOP长度。

#if USER_I_FRAME_QP
               // USER_I_FRAME_QP changes START 
               float uFrameRate = 0.0f;
               int uGopLength = 0; 
               // USER_I_FRAME_QP changes END 
			   
#endif  // USER_I_FRAME_QP

记录GOP长度
在EncoderSink 的EncoderSink函数设置GOP的变量的值。

    struct EncoderSink : IFrameSink
{
  EncoderSink(ConfigFile const& cfg, AL_IEncScheduler* pScheduler, AL_TAllocator* pAllocator
              ) :
    CmdFile(cfg.sCmdFileName, false),
    EncCmd(CmdFile.fp, cfg.RunInfo.iScnChgLookAhead, cfg.Settings.tChParam[0].tGopParam.uFreqLT),
    twoPassMngr(cfg.sTwoPassFileName, cfg.Settings.TwoPass, cfg.Settings.bEnableFirstPassSceneChangeDetection, cfg.Settings.tChParam[0].tGopParam.uGopLength,
                cfg.Settings.tChParam[0].tRCParam.uCPBSize / 90, cfg.Settings.tChParam[0].tRCParam.uInitialRemDelay / 90, cfg.MainInput.FileInfo.FrameRate),
    qpBuffers{cfg.Settings, cfg.RunInfo.eGenerateQpMode},
    pAllocator{pAllocator},
    pSettings{&cfg.Settings}
  {
 
#if USER_I_FRAME_QP
                 // USER_I_FRAME_QP changes STARTED ----------------------------------
                 uFrameRate = cfg.Settings.tChParam.tRCParam.uFrameRate;
                 uGopLength = cfg.Settings.tChParam.tGopParam.uGopLength;
                 // USER_I_FRAME_QP changes END --------------------------------------
#endif  // USER_I_FRAME_QP
 
    } 

设置QP
在EncoderSink 的ProcessFrame函数里,根据GOP长度,确定每个GOP开始的I帧。然后再设置QP的值。可以试试20-35之间的QP值。QP值是20时,能带来很好的图像质量。

void ProcessFrame(AL_TBuffer* Src) override
  {
    if(m_picCount == 0)
      m_StartTime = GetPerfTime();
 
    if(!Src)
    {
      LogVerbose("Flushing...\n\n");
 
      if(!AL_Encoder_Process(hEnc, nullptr, nullptr))
        throw std::runtime_error("Failed");
      return;
    }
 
    DisplayFrameStatus(m_picCount);
 
    if(twoPassMngr.iPass)
    {
      auto pPictureMetaTP = AL_TwoPassMngr_CreateAndAttachTwoPassMetaData(Src);
 
      if(twoPassMngr.iPass == 2)
        twoPassMngr.GetFrame(pPictureMetaTP);
    }
 
    AL_TBuffer* QpBuf = qpBuffers.getBuffer(m_picCount);
 
    std::shared_ptr QpBufShared(QpBuf, [&](AL_TBuffer* pBuf) { qpBuffers.releaseBuffer(pBuf); });
 
    if(pSettings->hRcPluginDmaContext != NULL)
      RCPlugin_SetNextFrameQP(pSettings, pAllocator);
 
#if   USER_I_FRAME_QP
    if( 0 == (m_picCount%uGopLength) )
    {
 
        AL_Encoder_SetQP(hEnc, 20 );
    }
#endif  // USER_I_FRAME_QP
 
    
    if(!AL_Encoder_Process(hEnc, Src, QpBuf))
      throw std::runtime_error("Failed");
 
    m_picCount++;
    m_picGopCount++;
  }

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4670

    浏览量

    67764
  • MPSoC
    +关注

    关注

    0

    文章

    194

    浏览量

    24190
收藏 人收藏

    评论

    相关推荐

    can标准和扩展能否共存

    CAN(Controller Area Network)是一种用于汽车和工业自动化领域的现场总线通信协议。CAN协议具有多种格式,包括标准和扩展。在实际应用中,标准和扩展
    的头像 发表于 07-24 15:24 830次阅读

    can标准和扩展的区别

    CAN(Controller Area Network)是一种用于汽车和工业领域的通信协议,它允许多个设备在同一总线上进行通信。CAN协议有两种类型:标准和扩展。这两种类型在结
    的头像 发表于 07-24 15:20 691次阅读

    can网络数据的特点

    特点,在分布式系统中得到了广泛应用。 数据的重要性 :数据是CAN网络中用于数据传输的基本单元,其结构设计和特性直接关系到整个网络的通信效率和可靠性。 二、数据的结构 基本构成 :CAN数据
    的头像 发表于 07-24 15:18 211次阅读

    can数据有哪几个域组成

    CAN(控制器局域网络)是一种基于消息传递的通信协议,广泛应用于汽车、工业自动化和嵌入式系统等领域。CAN协议的数据是用于传输信息的基本单位。 1. CAN数据概述 CAN数据是一种用于在
    的头像 发表于 07-24 15:14 384次阅读

    CAN数据的各个域及其作用

    CAN(Controller Area Network)是一种用于汽车电子系统中的通信协议,它具有高可靠性、实时性和灵活性等特点。在CAN通信中,数据是最基本的通信单元,用于传输信息。 概述
    的头像 发表于 07-24 15:10 427次阅读

    AMD HYPR-RX支持AMD生成技术,助力即刻提升游戏性能

    AMD Fluid Motion Frames(AFMF)—AMD生成技术,助力AMD Radeon用户在数千款DirectX 11和DirectX 12游戏中,使用插值技术来提高
    的头像 发表于 03-15 11:35 3675次阅读
    AMD HYPR-RX支持AMD<b class='flag-5'>帧</b>生成技术,助力即刻提升游戏性能

    为了提高应用的安全性,TLD7002-16ES的间延迟应该更长还是更短?

    问题:为了提高应用的安全性,TLD7002-16ES的间延迟应该更长还是更短? 答案:根据数据表,https://www.infineon.com/dgdl
    的头像 发表于 03-04 09:45 351次阅读

    CAN总线的标准和扩展有什么区别呢?分别适用于什么工况?

    CAN总线的标准和扩展是CAN协议中的两种类型。
    的头像 发表于 01-30 09:41 4620次阅读
    CAN总线的标准<b class='flag-5'>帧</b>和扩展<b class='flag-5'>帧</b>有什么区别呢?分别适用于什么工况?

    使用MODBUS协议的时候可以不用设置数据格式了吗?

    在使用MODBUS协议进行串口通讯时,通常需要设置数据格式。
    的头像 发表于 01-30 09:32 587次阅读

    CAN通信协议中有哪几种类型?CAN通信中格式的作用

    CAN通信协议中有四种类型,分别是数据、远程、错误和过载
    的头像 发表于 01-30 09:18 4339次阅读

    can标准和扩展区别

    标准和扩展是用于在控制器局域网(CAN)中传输数据的两种基本格式。它们在结构、标识符长度、数据长度以及数据传输和应用上存在一些区别。本文将详细介绍标准和扩展
    的头像 发表于 12-08 10:08 7727次阅读

    can数据的标准格式

    CAN(Controller Area Network)是一种广泛应用于汽车、工业控制和通信领域的串行通信总线标准。CAN数据是CAN总线上传输数据的基本单位,它包含了一系列的字段,用于确定
    的头像 发表于 12-01 16:41 3637次阅读

    TSMaster采样点配置方法与消除错误流程

    当通讯节点间采样点参数和波特率参数不匹配造成一些错误时,我们如何在TSMaster中设置以及调整波特率参数和采样点参数,来减少以及消除总线上出现的错误,进一步提高通信
    的头像 发表于 11-25 08:21 590次阅读
    TSMaster采样点配置方法与消除错误<b class='flag-5'>帧</b>流程

    单片机接收数据尾校验数据解析

    单片机接收数据尾校验数据解析
    的头像 发表于 10-17 17:23 1210次阅读
    单片机接收数据<b class='flag-5'>帧</b><b class='flag-5'>帧</b>头<b class='flag-5'>帧</b>尾校验数据解析

    详解Modbus协议的RTU和ASCII(2)

    前面已经分析过RTU和ASCII的报文区别,细心的朋友应该会发现在两种不同的报文传输模式下都有一个共同的组成部分——差错校验。
    发表于 10-01 10:38 759次阅读
    详解Modbus协议的RTU<b class='flag-5'>帧</b>和ASCII<b class='flag-5'>帧</b>(2)