首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >媒体基金会:英特尔硬件MFT的SPS/PPS问题

媒体基金会:英特尔硬件MFT的SPS/PPS问题
EN

Stack Overflow用户
提问于 2019-11-19 14:27:33
回答 1查看 334关注 0票数 6

我使用英特尔硬件MFT将NV12帧编码成H264流,使用Live555通过局域网通过RTP对编码帧进行流处理,并在另一端设置ffplay设置来解码和显示这些帧。该设置与软件编码器(同步或ASYNC软件MFT )工作良好,但是当在Intel硬件MFT中进行编码时,ffplay抱怨SPS/PPS的不可用性,只显示加扰的屏幕。我发现英特尔硬件编码器在输入初始样本后触发MF_E_TRANSFORM_STREAM_CHANGE事件,并通过MF_MT_MPEG_SEQUENCE_HEADER使SPS/PPS可用。我能够捕捉到那个MF_E_TRANSFORM_STREAM_CHANGE事件并得到序列头blob。

问题是,Live555要求分别设置SPS和PPS。但是,我真的很困惑从MF_MT_MPEG_SEQUENCE_HEADER blob中提取SPS和PPS。

根据我的理解,以及在其他线程中的进一步查找,SPS和PPS分别从00 00 0 0 6 7和0 0 0 6 8开始。但是,我并没有在我从Intel编码器收到的blob中找到这些序列。

https://github.com/cisco/openh264/issues/756启动SPS: 00 00 01 67 PPS启动时间: 00 00 01 68

从英特尔MFT获得的序列头: 序列头大小50 顺序标头:0 0 1 27 64 0 28 ac 2b 40 3c 1 13 f2 e0 22 0 0 3 0 0 0 3 0 0 3 0 0 3 d0 80 f 42 0 3 d0 93 7b df 7 68 70 ca 80 0 0 0 1 28 ee 3c b0 0

代码语言:javascript
运行
复制
vector<byte> sequenceHeaderData;
UINT32 sequenceHeaderDataSize = 0;

MFT_OUTPUT_DATA_BUFFER _outputDataBuffer;
memset(&_outputDataBuffer, 0, sizeof _outputDataBuffer);
_outputDataBuffer.dwStreamID = outputStreamID;
_outputDataBuffer.dwStatus = 0;
_outputDataBuffer.pEvents = nullptr;
_outputDataBuffer.pSample = nullptr;

HRESULT mftProcessOutput = _pEncoder->ProcessOutput(0, 1, &_outputDataBuffer, &processOutputStatus);

if (MF_E_TRANSFORM_STREAM_CHANGE == mftProcessOutput) 
{
    // some encoders want to renegotiate the output format. 
    if (_outputDataBuffer.dwStatus & MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE)
    {
        CComPtr<IMFMediaType> pNewOutputMediaType = nullptr;
        HRESULT res = _pEncoder->GetOutputAvailableType(outputStreamID, 1, &pNewOutputMediaType);

        res = _pEncoder->SetOutputType(outputStreamID, pNewOutputMediaType, 0);//setting the type again
        CHECK_HR(res, "Failed to set output type during stream change");

        {
            CComPtr<IMFMediaType> pCurOutputMediaType = nullptr;
            HRESULT res = _pEncoder->GetOutputAvailableType(outputStreamID, 1, &pCurOutputMediaType);

            res = pCurOutputMediaType->GetBlobSize(MF_MT_MPEG_SEQUENCE_HEADER, &sequenceHeaderDataSize);

            if (SUCCEEDED(res) && sequenceHeaderDataSize > 0) 
            {
                sequenceHeaderData.resize(sequenceHeaderDataSize);

                pCurOutputMediaType->GetBlob(MF_MT_MPEG_SEQUENCE_HEADER, sequenceHeaderData.data(), sequenceHeaderDataSize, NULL);

                cout << "Sequence header size " << sequenceHeaderDataSize << std::endl;
            }
            else 
            {
                cout << "Sequence header is not available" << std::endl;
            }
        }
    }
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 15:36:41

根据我的理解,以及在其他线程中的进一步查找,SPS和PPS分别从00 00 0 0 6 7和0 0 0 6 8开始。

你以为错了。

从您的示例标题中:

这是SPS: 0 0 1 27 64 0 28 ac 2b 40 3c 1 13 f2 e0 22 0 0 3 0 0 0 d0 80 f 42 0 3 d0 93 7b df 7 68 70 ca 80

这是PPS: 0 0 0 1 28 ee 3c b0 0

解释

SPS类型在第一个字节的最后5位中定义为7,在开始代码之后。(不是67)。

PPS类型在第一个字节的最后5位中是8,分别在开始代码之后(而不是68)。

注意:开始代码只能包含3个字节,其值分别为0 0 1。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58936296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档