Windows Media Encoder不保存MF_MT_MPEG_SEQUENCE_HEADER

问题描述 投票:1回答:1

我想使用Win7 Media Foundation SDK将视频帧编码为H264,然后使用sinkwriter将它们保存为.mp4文件。但是,当我不手动将MF_MT_MPEG_SEQUENCE_HEADER添加到输出媒体类型且文件无法播放时,sinkwriter终结失败。

我检查了编码器,它应该添加它(参见H.264 Video Encoder)。但它只是给出了MF_E_ATTRIBUTENOTFOUND错误。

IMFMediaType * outputType;
hr = m_pEncoder->GetOutputCurrentType(0, &outputType);
UINT32 sequenceHeaderDataSize;
hr = outputType->GetBlobSize(MF_MT_MPEG_SEQUENCE_HEADER, &sequenceHeaderDataSize);

使用MF_MT_MPEG_SEQUENCE_HEADER,我在网上找到(1080p),我能够得到一个可播放的文件。然而,它仍然存在一些亮度错误(随机变化〜每0.5秒)和阻塞错误。

UINT8 blob[] = {0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x2A, 0xAD, 0x84, 0x01, 0x0C, 0x20, 0x08, 0x61, 0x00, 0x43, 0x08, 0x02, 0x18, 0x40, 0x10, 0xC2, 0x00, 0x84, 0x2B, 0x50, 0x3C, 0x01, 0x13, 0xF2, 0xC2, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x79, 0x08, 0x00, 0x00, 0x00, 0x01, 0x68, 0xEE, 0x3C, 0xB0};


//create sink attributes
IMFAttributes *  sinkAttributes = NULL;
HRESULT hr = MFCreateAttributes(&sinkAttributes, 1);
hr = sinkAttributes->SetUINT32(MF_READWRITE_DISABLE_CONVERTERS, true);

//create sink
IMFSinkWriter * pSinkWriter = NULL;
hr = MFCreateSinkWriterFromURL(L"output.mp4", NULL, sinkAttributes, &pSinkWriter);

// Set the output media type.
IMFMediaType * pMediaTypeOut = NULL;
CHECK_HR(MFCreateMediaType(&pMediaTypeOut));
CHECK_HR(pMediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
CHECK_HR(pMediaTypeOut->SetGUID(MF_MT_SUBTYPE, VIDEO_INPUT_FORMAT));
CHECK_HR(MFSetAttributeSize(pMediaTypeOut, MF_MT_FRAME_SIZE, VIDEO_WIDTH, VIDEO_HEIGHT));
CHECK_HR(MFSetAttributeRatio(pMediaTypeOut, MF_MT_FRAME_RATE, VIDEO_FPS, 1));
CHECK_HR(pMediaTypeOut->SetBlob(MF_MT_MPEG_SEQUENCE_HEADER, blob, sizeof(blob)));
CHECK_HR(pSinkWriter->AddStream(pMediaTypeOut, &streamIndex));

// Tell the sink writer to start accepting data.
hr = pSinkWriter->BeginWriting();

这可能与Windows 7有关,遗憾的是我无法在Windows 10计算机上查看。

在其他地方需要编码的帧,所以我不能跳过编码并将我的帧直接放入接收器。

windows video mp4 ms-media-foundation
1个回答
1
投票

有些编码器,比如 - 如果我没记错的话 - 非常流行且可在Windows 7 Intel Quick Sync上使用,只有在开始样品处理后才能使用MF_MT_MPEG_SEQUENCE_HEADER。也就是说,当您管理MFT时,您必须执行ProcessInputProcessOutput,处理动态格式更改,更改媒体类型,并在新媒体类型中有序列标题。也就是说,只有在准备好在初始输入发送后从编码器接收到的数据时,才应该开始编码并初始化接收器编写器。

你必须有适当的MF_MT_MPEG_SEQUENCE_HEADER,你不能硬编码随机值。您可以像进行故障排除一样,但这些不仅仅是给定分辨率的一些字节。

注意Windows 8 updates to MPEG-4 source and sink

可以从MPEG-4接收器中的输入样本中提取SPS和PPS。

当在MPEG-4接收器的输入媒体类型上没有通过MF_MT_MPEG_SEQUENCE_HEADER设置SPS和PPS时,MPEG-4接收器将尝试从输入样本中提取SPS和PPS。 MPEG-4接收器在找到第一个SPS和PPS之前忽略任何输入样本,因为没有SPS和PPS的所有输入样本都不可解码。

事实上,由于更新而在Windows 8中工作的东西在Windows 7中不可用,你必须自己处理MF_MT_MPEG_SEQUENCE_HEADER

© www.soinside.com 2019 - 2024. All rights reserved.