首页 > 解决方案 > 用于实时流式传输的基本快速同步参数

问题描述

我已经为实时流式传输编写了快速同步编码器硬件实现。一切正常,但是现在我陷入了编码器参数化。来自英特尔的文档非常差且不具体。我读了:

我也尝试遵循 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 使用的配置文件相同)。

标签: c++video-streamingwebrtcintelencoder

解决方案


推荐阅读