编写大于2048x2048的H264视频? [英] Writing H264 videos larger than 2048x2048?
问题描述
我使用SinkWriter示例中的代码编写H264 MP4文件。这很有效,直到我试图超过2048x2048,此时我在接收器编写器上调用SetInputMediaType时出现MF_E_INVALIDMEDIATYPE错误。我如何克服这个问题?
I used code from the SinkWriter sample to write a H264 MP4 file. That worked well until I tried to go over 2048x2048, at which point I get a MF_E_INVALIDMEDIATYPE error when calling SetInputMediaType on the sink writer. How do I overcome this problem?
我在Windows 8.1上运行并在VS2013中开发。
I'm running on Windows 8.1 and developing in VS2013.
这是我用来创建接收器的代码writer:
Here's the code I use to create the sink writer:
hr = MFCreateSinkWriterFromURL(wfile, NULL, NULL, &m_sinkWriter);
// Set the output media type
hr = MFCreateMediaType(&mediaTypeOut);
hr = mediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
hr = mediaTypeOut->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);
hr = mediaTypeOut->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_High); // Default is Base, High requires Windows 8
hr = mediaTypeOut->SetUINT32(MF_MT_AVG_BITRATE, bitrate);
hr = mediaTypeOut->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); // No interlacing
hr = mediaTypeOut->SetUINT32(MF_MT_DEFAULT_STRIDE, width * 4);
hr = MFSetAttributeSize(mediaTypeOut, MF_MT_FRAME_SIZE, width, height);
hr = MFSetAttributeRatio(mediaTypeOut, MF_MT_FRAME_RATE, c_fps, 1);
hr = MFSetAttributeRatio(mediaTypeOut, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
hr = m_sinkWriter->AddStream(mediaTypeOut, &m_videoStream);
// Set the input media type
hr = MFCreateMediaType(&mediaTypeIn);
hr = mediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
hr = mediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32);
hr = mediaTypeIn->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); // No interlacing
hr = mediaTypeIn->SetUINT32(MF_MT_DEFAULT_STRIDE, width * 4);
hr = MFSetAttributeSize(mediaTypeIn, MF_MT_FRAME_SIZE, width, height);
hr = MFSetAttributeRatio(mediaTypeIn, MF_MT_FRAME_RATE, c_fps, 1);
hr = MFSetAttributeRatio(mediaTypeIn, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
hr = m_sinkWriter->SetInputMediaType(m_videoStream, mediaTypeIn, NULL);
// Tell the sink writer to start accepting data
hr = m_sinkWriter->BeginWriting();
推荐答案
原来我没有使用MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS。当我设置它时,我在创建SetInputMediaType时没有错误,但如果我设置的大小大于1920x1080,我会得到E_FAIL用于IMFSinkWriter :: WriteSample(在文档中甚至没有提到
) 。所以软件仍然优越,但不足以满足我的需求。
Turned out I wasn't using MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS. When I set it, I get no errors when creating for SetInputMediaType, but if I set a size larger than 1920x1080 I get E_FAIL for IMFSinkWriter::WriteSample (which isn't even mentioned in the docs as a possibility). So software is still superior, but not good enough for my needs.
(这是在Radeon 290X上。我想具体的硬件会影响到什么可以完成。)
(That's on a Radeon 290X. I imagine the specific hardware affects what can be done.)
这篇关于编写大于2048x2048的H264视频?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!