我正在使用 MediaFoundation APIS 从我的网络摄像头读取帧。
IMFMediaType mediatype = null;
Hresult hr= mSourceReaderAsync.GetNativeMediaType((int)MF_SOURCE_READER.FirstAudioStream, i, out mediatype);
只返回 YUY2 媒体类型。所以我得到 ReadSample 的输出给出了 YUY2 帧。我需要将 YUY2 转换为 RGB24 或 BitmapSource 以显示在 WPF 窗口中。这是我的 OnRead 回调方法
public HResult OnReadSample(HResult hrStatus, int dwStreamIndex, MF_SOURCE_READER_FLAG dwStreamFlags, long llTimestamp, IMFSample pSample)
{
HResult hr = hrStatus;
IMFMediaBuffer pBuffer = null;
Stream s = null;
JpegBitmapDecoder jpgdecoder = null;
BitmapSource cameraframe = null;
lock (this)
{
try
{
if (Succeeded(hr))
{
if (pSample != null)
{
// Get the video frame buffer from the sample.
hr = pSample.GetBufferByIndex(0, out pBuffer);
}
}
if (pBuffer != null)
{
int maxlen, curlen;
pBuffer.GetMaxLength(out maxlen);
pBuffer.GetCurrentLength(out curlen);
var arr = new byte[maxlen - 1];
pBuffer.Lock(out IntPtr ptr, out int maxLen, out int curLen);
if (arr == null)
arr = new byte[maxlen - 1];
var writable = (maxlen > 0) ? true : false;
if (s == null)
s = new MemoryStream(arr, writable);
System.Runtime.InteropServices.Marshal.Copy(ptr, arr, 0, curlen);
s.Flush();
s.Seek(0, SeekOrigin.Begin);
if (jpgdecoder == null)
jpgdecoder = new JpegBitmapDecoder(s, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
var frame = jpgdecoder.Frames[0];
cameraframe = frame;
}
dispatcher.Invoke(() =>
{
OnCapture.Invoke(this, cameraframe);
});
// Request the next frame.
if (Succeeded(hr))
{
// Ask for the first sample.
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
SafeRelease(pBuffer);
SafeRelease(pSample);
dispatcher.Invoke(() =>
{
hr = mSourceReaderAsync.ReadSample((int)MF_SOURCE_READER.FirstVideoStream, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
});
}
}
return hr;
}
现在它引发异常{“未找到适合完成此操作的成像组件。”}