编写大于2048x2048的H264视频? [英] Writing H264 videos larger than 2048x2048?

查看:135
本文介绍了编写大于2048x2048的H264视频?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆