c++ - 用于实时流式传输的基本快速同步参数
问题描述
我已经为实时流式传输编写了快速同步编码器硬件实现。一切正常,但是现在我陷入了编码器参数化。来自英特尔的文档非常差且不具体。我读了:
- SDK API 参考手册
- 英特尔媒体开发人员指南(2017 年修订版)
我也尝试遵循 NVENC 指南(我不久前为 Nvidia 做过同样的事情,一切正常),但这里也没有运气。
到目前为止:
m_mfxEncParams.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY;
m_mfxEncParams.AsyncDepth = 4;
m_mfxEncParams.mfx.TargetKbps = my_target_bps_ / 1000;
m_mfxEncParams.mfx.MaxKbps = 0;
//m_mfxEncParams.mfx.InitialDelayInKB = 0;
m_mfxEncParams.mfx.BufferSizeInKB = my_width_ * my_height_ * 1.5;
//FRAME INFO PARAMS
ConvertFrameRate(30, &m_mfxEncParams.mfx.FrameInfo.FrameRateExtN, &m_mfxEncParams.mfx.FrameInfo.FrameRateExtD);
m_mfxEncParams.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12;
m_mfxEncParams.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
m_mfxEncParams.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
m_mfxEncParams.mfx.FrameInfo.Shift = 0;
m_mfxEncParams.mfx.FrameInfo.CropX = 0;
m_mfxEncParams.mfx.FrameInfo.CropY = 0;
m_mfxEncParams.mfx.FrameInfo.CropW = my_width_;
m_mfxEncParams.mfx.FrameInfo.CropH = my_height_;
m_mfxEncParams.mfx.FrameInfo.Width = MSDK_ALIGN16(width_);
m_mfxEncParams.mfx.FrameInfo.Height =
(MFX_PICSTRUCT_PROGRESSIVE == m_mfxEncParams.mfx.FrameInfo.PicStruct)
? MSDK_ALIGN16(height_)
: MSDK_ALIGN32(height_);
m_mfxEncParams.mfx.CodecId = MFX_CODEC_AVC;
m_mfxEncParams.mfx.CodecProfile = MFX_PROFILE_AVC_BASELINE;
m_mfxEncParams.mfx.CodecLevel = 0;
m_mfxEncParams.mfx.GopPicSize = 0;
m_mfxEncParams.mfx.GopRefDist = 1;
m_mfxEncParams.mfx.GopOptFlag = MFX_GOP_STRICT;
m_mfxEncParams.mfx.IdrInterval = 0;
//TRADEOF BETWEEN QUALITY AND SPEED
m_mfxEncParams.mfx.TargetUsage = MFX_TARGETUSAGE_BALANCED;
m_mfxEncParams.mfx.RateControlMethod = MFX_RATECONTROL_CBR;
m_mfxEncParams.mfx.NumSlice = 0;
m_mfxEncParams.mfx.NumRefFrame = 0;
m_mfxEncParams.mfx.EncodedOrder = 0; // binary flag, 0 signals encoder to take frames in display order
//CODING OPTION 2
auto codingOption2 = m_mfxEncParams.AddExtBuffer<mfxExtCodingOption2>();
codingOption2->LookAheadDepth = 0;
codingOption2->MaxSliceSize = 0;
codingOption2->MaxFrameSize = 0;
codingOption2->BRefType = MFX_B_REF_OFF;
codingOption2->ExtBRC = 0;
codingOption2->IntRefType = 0;
codingOption2->IntRefCycleSize = 0;
codingOption2->IntRefQPDelta = 0;
codingOption2->AdaptiveI = 0;
codingOption2->AdaptiveB = 0;
现在对于全高清,我有 20 FPS 的非常低质量的比特率大约 2mb/s(峰值,静态大约是 800kb/s),而对于 Nvidia 上的全高清,我有 40 FPS 的真正质量的图像,比特率大约 1.3 mb/s(峰值,静态约为 300kb/s)
我需要某种起点设置来使用 QuickSync 进行实时流式传输,或者至少需要一些关于该主题的额外文献。
编辑:我应该指定。该硬件实现的唯一目的是对图像进行编码以通过 webrtc 发送到浏览器。这就是我使用基线配置文件的原因。我知道理论上 chromium 可以解码 Main 和 High 配置文件,但是现在我只想保持在官方支持的 Baseline 配置文件的边界内(与 NVENC 使用的配置文件相同)。
解决方案
推荐阅读
- here-api - Here Maps API中特定区域/城市的路线限制
- android - requestPermissions() 方法在 Activity 中显示错误警告
- python - 如何使用python从字符串中获取所需的文本?
- c# - 映射 Automapper 配置中的问题
- javascript - javascript将未来的日期转换为时间戳
- oracle - 如何为仅具有受限访问权限的用户获取 Oracle 数据库的 DDL
- hyperledger-fabric - 了解 Hyperledger Fabric 块提取
- javascript - navigator.mediaDevices.getUserMedia API 拒绝错误“NotReadableError:并发麦克风进程限制。”
- c# - 检查 exe 是否已经使用相同的参数运行 c#
- memory-leaks - 使用 AFHTTPSessionManager 时的内存泄漏