В моем приложении windows universal я пытаюсь использовать компонент WinRT: http://blogs.msdn.com/b/eternalcoding/archive/2013/03/06/developing-a-winrt-component-to-create-a-video-file-using-media-foundation.aspx (который в основном является оболочкой C ++ для WinkWriter)
создать видео с кадрами.
Я поместил весь этот код в проект 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
Есть идеи ?
Я использовал этот пример VideoGenerator и получил ту же проблему.
Я не эксперт Media Foundation, но после некоторых исследований я обнаружил, что проблема заключалась в следующем:
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