0

我正在使用 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;
}

现在它引发异常{“未找到适合完成此操作的成像组件。”}

4

1 回答 1

1

我认为您可以使用媒体基础转换在类型之间进行转换。您可以通过 snarfle 参考 MF.net 中的示例 在此处输入链接描述

于 2022-03-04T15:58:48.860 回答