Я использую mediaCapture с AddEffectsAsync, чтобы установить MFT на камеру. Используя этот MFT, я смог вернуть данные для каждого кадра из MFT. Теперь растровое изображение выглядит как класс Nokia :: Ghraphics :: Imaging :: Bitmap. В следующем коде, я беру размер буфера и буфера от него и отправить его в моем приложении:C++/CX Как создать BitmapImage из буфера и количества буфера
void TransformImage_NV12(
const D2D_RECT_U &rcDest,
_Inout_updates_(_Inexpressible_(2 * lDestStride * dwHeightInPixels)) BYTE *pDest,
_In_ LONG lDestStride,
_In_reads_(_Inexpressible_(2 * lSrcStride * dwHeightInPixels)) const BYTE *pSrc,
_In_ LONG lSrcStride,
_In_ DWORD dwWidthInPixels,
_In_ DWORD dwHeightInPixels,
IVector<IImageProvider^>^ providers)
{
auto size = Windows::Foundation::Size(dwWidthInPixels, dwHeightInPixels);
auto totalbytes = (int)dwHeightInPixels * (int)dwWidthInPixels * 3/2;
Nokia::Graphics::Imaging::Bitmap^ m_BitmapToProcess = AsBitmapNV12(pSrc, (unsigned int)size.Width, (unsigned int)size.Height);
BitmapImageSource^ source = ref new BitmapImageSource(m_BitmapToProcess);
auto first = providers->GetAt(0);
((IImageConsumer^)first)->Source = source;
auto last = providers->GetAt(providers->Size - 1);
BitmapRenderer^ renderer = ref new BitmapRenderer(last, ColorMode::Yuv420Sp);
auto renderOp = renderer->RenderAsync();
auto renderTask = create_task(renderOp);
renderTask.then([pDest, totalbytes](Nokia::Graphics::Imaging::Bitmap^ bitmap)
{
auto count = bitmap->Buffers->Length;
unsigned char* data = FromIBuffer(bitmap->Buffers[0]->Buffer);
CMFTWrapper::FrameData = data;
CMFTWrapper::count = count;
SetEvent(CMFTWrapper::FrameEvent());
CopyMemory(pDest, data, totalbytes);
}).wait();
}
Doing это у меня есть обратный вызов вызывается в моем приложении:
void VideoCapturerSampleCallback(struct LmiVideoCapturer_* capturer, const LmiVideoFrame* videoFrame, LmiVoidPtr userData)
{
App2::MainPage^ ctx = context;
Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([ctx]()
{
Windows::UI::Xaml::Media::Imaging::BitmapImage^ bitmapImage =
ref new Windows::UI::Xaml::Media::Imaging::BitmapImage();
//TODO will need to create it from the buffer
media->Source = bitmapImage;
}));
}
Здесь у меня есть доступ к буферу и счету из MFT, используя класс CMFTWrapper, в котором я сохранил данные. Мой вопрос в том, как я могу загрузить эти данные внутри моего bitmapImage, который я создал? Я нашел несколько кодов, показывающих мне, как построить aa bitmapImage, но большинство из них находятся на C#, и мне нужно использовать C++/cx
Кстати, может быть образец, опубликованный в какой-то момент о том, как сделать MFT, который использует конвейер SDK Imaging. Это будет интересно? –