介绍
在有些应用中,发现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
发布评论请先 登录
相关推荐
8168编码出来的 I 帧 比 p帧大很多, 但是有的mcu编码出来的i帧和p帧相差不多, 请问如何减小 I 帧的大小?
I 帧 比 p帧大很多但是有的mcu编码出来的i帧和p帧相差不多请问如何减小 I 帧的大小
发表于 05-28 04:02
有没有办法让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次下载
详细讲解CAN帧间隔格式
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开,过载帧和错误帧前不能插入
发表于 10-10 09:26
•977次阅读
评论