我在学习创建与使用Windows媒体基金会使用本教程的原始固定彩色图像的视频文件http://blogs.msdn.com/b/eternalcoding/archive/2013/03/06/developing-a-winrt-component-to -创建-A-视频使用文件-媒体foundation.aspx
我能够创造在上面的链接显示RGB编码的WMV视频。 但我需要从图像中NV12格式创建YUV编码的MP4视频。 由于NV12使用(宽×高×3/2)为每一帧的存储器缓冲区中的字节,我创建(宽×高×3/2)缓冲器,用于图像缓冲器(在教程变量“目标”)的字节和设置一些固定值,以它作为图像数据。 然后设置图像步幅“W”(ARGB使用WX4如步幅)用于MFCopyImage()和高度被设置为只是“H”。 但是,这似乎并没有工作。 MF_MT_SUBTYPE设置为MFVideoFormat_NV12。
什么是创建一个NV12编码的MP4视频文件的正确方法是什么?
我怀疑你做太多的工作(这希望是个好消息)的。 首先记住的是,例如不编码输出RGB。 RGB只不过是输入型的接收器,你可以随时离开这种方式。
所述容器是MFTranscodeContainerType_ASF(在仲上更多),并且subtypte是MFVideoFormat_WMV3,结果是公压缩Windows媒体视频文件。
当创建水槽作家,在你的情况下,容器会自动创建,因为没有指定的属性了。 事实上,增加的唯一属性是以下行MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS:
MFCreateAttributes(&spAttr, 10);
spAttr->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, true);
hr = MFCreateSinkWriterFromURL(L".wmv",
spByteStream.Get(),
spAttr.Get(),
&sinkWriter);
这引出了一个问题 - “为什么是10点属性分配” ...(耸肩)哦,没关系。
问题的关键是,你送RGB帧发送到接收器,和转换正在做完成编码的规范。 集装箱可以在这里找到:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd388919(v=vs.85).aspx
和之前创建的水槽,你会指定类似下面的一个给定的容器:
spAttr->SetGUID(MF_TRANSCODE_CONTAINERTYPE, MFTranscodeContainerType_ASF);
// or MFTranscodeContainerType_MPEG4, MFTranscodeContainerType_AVI, etc
您以前使用下面的行设置的亚型:
hr = mediaTypeOut->SetGUID(MF_MT_SUBTYPE, encodingFormat);
// where encodingFormat was hardcoded to MFVideoFormat_WMV3 in the ctor
但是请记住,有些格式期待自下而上的图像。 尝试改变文件扩展名为” .mp4" ,容器MFTranscodeContainerType_AVI,和子类型MFVideoFormat_NV12,你会看到你的相同视频倒置。 而且,由于所有的YUV值放入该文件的文件将是巨大的比较WMV格式。
获取容器和格式正确细节需要照顾的一个很好的协议,以及一些细节难以考证。
希望这可以帮助。