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

    文章

    4741

    浏览量

    68326
  • MPSoC
    +关注

    关注

    0

    文章

    198

    浏览量

    24246
收藏 人收藏

    评论

    相关推荐

    以太网格式和功能详解

    以太网(Ethernet Frame)是以太网(Ethernet)协议用于在局域网(LAN)中传输数据的基本单位。理解以太网的结构和传输过程对于掌握局域网通信的原理至关重要。以下将从以太网的定义、格式以及功能三个方面进行详
    的头像 发表于 10-08 10:03 1077次阅读

    can标准和扩展能否共存

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

    can标准和扩展的区别

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

    can网络数据的特点

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

    can数据有哪几个域组成

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

    CAN数据的各个域及其作用

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

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

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

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

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

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

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

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

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

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

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

    Coral3568如何软硬件过滤can及优化?

    CAN总线调试时,根据数据的重要性,接收端可以专注于接收重要消息,提高效率。CAN报文是用一个标识符或一系列标识符来过滤的。可以使用CAN总线软件和芯片硬件过滤规则实现过滤功能。软件过滤
    的头像 发表于 12-08 15:52 593次阅读
    Coral3568如何软硬件过滤can<b class='flag-5'>帧</b>及优化?

    can标准和扩展区别

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

    can数据的标准格式

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

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

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