我正在学习使用使用本教程http://blogs.msdn.com/b/eternalcoding/archive/2013/03/06/developing-a-winrt-component-to-create-a-video-file-using-media-foundation.aspx创建带有原始固定彩色图像的视频文件
我能够创建RGB编码的WMV视频显示在上面的链接。但我需要创建YUV编码的MP4视频以NV12格式从图像。由于NV12为每个帧使用(WxHx3/2)字节的内存缓冲区,所以我为图像缓冲区(教程中的变量“target”)创建了(WxHx3/2)字节,并将一些固定值设置为图像数据。然后为MFCopyImage()设置图像步长'W‘(ARGB使用Wx4作为步长),并将高度设置为'H’。但这似乎行不通。MF_MT_SUBTYPE设置为MFVideoFormat_NV12。
创建NV12编码的mp4视频文件的正确方法是什么?
发布于 2014-09-26 20:58:32
我怀疑你做了太多的工作(希望这是个好消息)。首先,请记住,该示例没有将输出编码为RGB。RGB只是接收器的输入类型,您可以随意保留它。
容器是MFTranscodeContainerType_ASF (稍后详细介绍),子类型是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,您将看到相同的视频。与wmv相比,您的文件将是巨大的,因为所有的YUV值都放在文件中。
要使容器和格式的细节正确,需要非常小心,有些细节很难研究。
希望这能有所帮助。
https://stackoverflow.com/questions/26038569
复制相似问题