gpt4 book ai didi

video-streaming - 媒体基金会 : SPS/PPS problem with Intel hardware MFT

转载 作者:行者123 更新时间:2023-12-01 21:24:41 29 4
gpt4 key购买 nike

我使用英特尔硬件 MFT 将 NV12 帧编码为 H264 流,并使用 Live555 通过 LAN 上的 RTP 流式传输编码帧,并在另一端设置 ffplay 来解码和显示相同的帧。该设置与软件编码器(SYNC 或 ASYNC 软件 MFT)配合得很好,但 ffplay 提示在 Intel 硬件 MFT 中完成编码时 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 00 01 67和0 00 00 01 68开头。但是,我在从英特尔编码器收到的 blob 中没有找到这些序列。

https://github.com/cisco/openh264/issues/756SPS 开始:00 00 00 01 67PPS 开始:00 00 00 01 68

Sequence header obtained from intel MFT:

Sequence header size 50

Squence Header: 0 0 1 27 64 0 28 ac 2b 40 3c 1 13 f2 e0 22 0 0 3 0 2 0 0 3 0 79 d0 80 f 42 0 3 d0 93 7b df 7 68 70 ca 80 0 0 0 1 28 ee 3c b0 0

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

enter image description here

最佳答案

As per my understanding, and further lookup in other threads, SPS and PPS start with 00 00 00 01 67 and 0 00 00 01 68 respectively.

你假设错了。

来自您的示例标题:

这是 SPS:0 0 1 27 64 0 28 ac 2b 40 3c 1 13 f2 e0 22 0 0 3 0 2 0 0 3 0 79 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

Explanation :

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

PPS nalu 类型在第一个字节的最后 5 位(起始码之后)分别为 8(不是 68)。

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

关于video-streaming - 媒体基金会 : SPS/PPS problem with Intel hardware MFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58936296/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com