【发布时间】:2019-03-29 07:42:22
【问题描述】:
我想使用 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