代码之家  ›  专栏  ›  技术社区  ›  geometrikal

如何在WPF中从原始帧渲染视频?

  •  1
  • geometrikal  · 技术社区  · 15 年前

    我有一个特殊的摄像机(使用GigEVision协议),我使用提供的库控制它。我可以订阅帧接收事件,然后通过IntPtr访问帧数据。

    在我以前的WinForms应用程序中,我可以通过从数据中创建位图对象并将其设置为PictureBox图像来渲染帧,或者通过将PictureBox句柄传递给所提供的库中的函数来直接绘制该区域。

    编辑(1):

    编辑(2):

    我找到了一个使用WriteableBitmap的解决方案:

    void camera_FrameReceived(IntPtr info, IntPtr frame) 
    {
        if (VideoImageControlToUpdate == null)
        {
            throw new NullReferenceException("VideoImageControlToUpdate must be set before frames can be processed");
        }
    
        int width, height, size;
        unsafe
        {
            BITMAPINFOHEADER* b = (BITMAPINFOHEADER*)info;
    
            width = b->biWidth;
            height = b->biHeight;
            size = (int)b->biSizeImage;
        }
        if (height < 0) height = -height;
    
            //Warp space-time
            VideoImageControlToUpdate.Dispatcher.Invoke((Action)delegate {
            try
            {
                if (VideoImageControlToUpdateSource == null)
                {
                    VideoImageControlToUpdateSource =
                        new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray8, BitmapPalettes.Gray256);
                }
                else if (VideoImageControlToUpdateSource.PixelHeight != height ||
                         VideoImageControlToUpdateSource.PixelWidth != width)
                {
                    VideoImageControlToUpdateSource =
                        new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray8, BitmapPalettes.Gray256);
                }
    
                VideoImageControlToUpdateSource.Lock();
    
                VideoImageControlToUpdateSource.WritePixels(
                    new Int32Rect(0, 0, width, height),
                    frame,
                    size,
                    width);
    
                VideoImageControlToUpdateSource.AddDirtyRect(new System.Windows.Int32Rect(0, 0, width, height));
                VideoImageControlToUpdateSource.Unlock();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        });
    }
    

    在上面, VideoImageControlToUpdate

    为了提高速度,我相信在codeplex上找到的videorenderelement更快。

    1 回复  |  直到 15 年前
        1
  •  0
  •   ima    15 年前

    最佳方式: WriteableBitmap.WritePixels(…,IntPtr源,…)

    最快的方式: