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++;
  }

审核编辑:郭婷

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

    关注

    28

    文章

    3942

    浏览量

    65606
  • MPSoC
    +关注

    关注

    0

    文章

    127

    浏览量

    23933
收藏 人收藏

    评论

    相关推荐

    IBP格式说明

    IBP格式说明
    发表于 11-21 20:54

    8168编码出来的 I 比 p大很多, 但是有的mcu编码出来的i和p相差不多, 请问如何减小 I 的大小?

    I 比 p大很多但是有的mcu编码出来的i和p相差不多请问如何减小 I 的大小
    发表于 05-28 04:02

    DM8168 如何产生一个强制I???

    I,在enclink里面有直接可以调用的函数吗???
    发表于 06-21 12:59

    有没有办法让i和p大小接近?

    i和p相差太大别的厂商芯片编出来的 i和p相差不多有没有办法调整i或者p的相对大小目前已知 见效码率 可以见效I和p的尺寸 但是有没有办法让i和p
    发表于 08-18 09:50

    如何实现ID的设置

    ID的设置CAN的ID分为标志和扩展,配置寄存器如下(这里仅贴上发送ID的寄存器(TXBnSIDH)配置,接收ID寄存器(RXBnSIDH)配置相同
    发表于 11-25 08:42

    一种高效的I分区错误隐藏方法

    I错误隐藏方法不能平衡恢复图像质量与算法复杂度的问题,提出了一种高效的I分区错误隐藏方法。首先,利用视频之间的运动相关性将丢失宏块分为运动宏块和静止宏块。对于静止宏块,采用拷贝法进行
    发表于 12-27 10:56 0次下载

    基于I复杂度的初始量化参数(QP)选择算法

    QP的关系重新拟合新的初始QP的选择方法。实验结果表明,在相同的码率下,该算法避免了传统码率控制中初始QP选择算法的弊端,可提高视频的客观质量,降低判断I的复杂度,客观峰值信噪比值比现有相关算法平均
    发表于 02-07 14:06 0次下载

    ADRF6755:100MHz到2400 MHz I/Q模拟器与集成N PLL和VCO

    I/Q模拟器与集成N PLL和VCO
    发表于 04-21 16:51 4次下载
    ADRF6755:100MHz到2400 MHz <b>I</b>/Q模拟器与集成<b>帧</b>N PLL和VCO

    缓冲记忆接口引脚功能

    缓冲记忆接口引脚功能
    发表于 01-16 23:54 510次阅读

    同步,同步是什么意思

    同步,同步是什么意思 在数字通信时,一般总是以一定数目的码元组成一个个的“字”或“句”,即组成一个个的“群”进行传输
    发表于 03-17 17:30 2.3w次阅读

    设置IQP的示例代码

    I不够大。MPSoC VCU CtrlSW可以设置每一QP大小。因此,可以通过设置IQP提高I的大小,从而
    的头像 发表于 10-20 11:35 1332次阅读

    CAN标准数据和扩展数据的区别

    和29位扩展数据,CAN标准数据和扩展数据只是ID长度不同,以便可以扩展更多CAN节点。
    的头像 发表于 09-28 09:50 9152次阅读

    详细讲解CAN间隔格式

    间隔是用于分隔数据和遥控。数据和遥控可通过插入间隔将本与前面的任何(数据、遥控、错误、过载)分开,过载和错误前不能插入
    发表于 10-10 09:26 977次阅读
    详细讲解CAN<b>帧</b>间隔格式

    类型及其在不同加密方式中的应用

    属于管理的子类型,符合管理通用定义格式:802.11 MAC Header + Frame Body + FCS,但其HT Control 字段为0。
    的头像 发表于 05-30 16:43 825次阅读
    <b>帧</b>类型及其<b>帧</b>在不同加密方式中的应用

    CAN协议数据的介绍

    格式来传输数据:数据、遥控、错误、过载间隔。其中数据和遥控有标准格式和扩展格式两种,标准格式有 11
    的头像 发表于 07-25 10:36 1696次阅读
    CAN协议数据<b>帧</b>的介绍