在我的windows通用应用中,我尝试使用WinRT组件:http://blogs.msdn.com/b/eternalcoding/archive/2013/03/06/developing-a-winrt-component-to-create-a-video-file-using-media-foundation.aspx(基本上是sinkWriter的C ++包装器)
使用框架制作视频。
我将所有这些代码放在一个C ++项目中,我可以毫无问题地从我的C#代码中调用它。
问题首先出现在构造函数中:
HRESULT CVideoGenerator::InitializeSinkWriter(Windows::Storage::Streams::IRandomAccessStream^ stream)
我不确定如何创建流:
var filename = "exportedVideo.wmv";
var folder = Windows.Storage.KnownFolders.VideosLibrary;
StorageFile storageFile = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);
StorageFile file = await StorageFile.GetFileFromPathAsync(App.PhotoModel.Path);
CVideoGenerator videoGenerator = new CVideoGenerator(1280, 720, stream, 20);
另一件事来自这条线:
hr = sinkWriter->SetInputMediaType(streamIndex, mediaTypeIn, NULL);
//hr 0xc00d5212 : No suitable transform was found to encode or decode the content. HRESULT
有什么想法吗?
答案 0 :(得分:0)
我已经使用了这个VideoGenerator示例,并遇到了同样的问题。 我不是媒体基金会的专家,但经过一些研究,我发现问题出在以下几个方面:
encodingFormat = MFVideoFormat_WMV3;
inputFormat = MFVideoFormat_RGB32;
好吧,我已经用第二种格式替换了第一种格式,如下所示:
encodingFormat = MFVideoFormat_RGB32;
inputFormat = MFVideoFormat_RGB32;
它似乎一直有效,直到WriteSample
方法
hr = MFCopyImage(
pData, // Destination buffer.
cbWidth, // Destination stride.
(BYTE*)videoFrameBuffer, // First row in source image.
cbWidth, // Source stride.
cbWidth, // Image width in bytes.
videoHeight // Image height in pixels.
);
在内存中写入时显然存在访问冲突。 还是想弄明白!
McSime