从帧创建视频

时间:2014-12-23 22:54:24

标签: c# c++ win-universal-app

在我的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

有什么想法吗?

1 个答案:

答案 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