Csharp/C#教程:在WPF中生成和绘制video的快速方法是什么?分享


在WPF中生成和绘制video的快速方法是什么?

我正在编写一个video播放器来播放由我们的ASIC捕获的帧。 它们采用自定义格式,并且我已经提供了解码ASIC状态的function。 video可以是640×480到2560×1200(!!!)的任何大小。 每个状态周期的输出是16×16像素块,我必须在屏幕上看到一个video。

每次需要更新屏幕时,我都会收到以下信息:

主要限制:

我今天早上花了一些时间尝试WriteableBitmap,并将其用作Image的源代码,如下所示:

private WriteableBitmap ImageSource; public MainWindow() { InitializeComponent(); ImageSource = new WriteableBitmap(FrameWidth, FrameHeight, 96, 96, PixelFormats.Bgr32, null); ImagePanel.Source = ImageSource; } private void DrawBox(byte Red, byte Green, byte Blue, int X, int Y) { int BoxWidth = 16; int BoxHeight = 16; int BytesPerPixel = ImageSource.Format.BitsPerPixel / 8; byte[] Pixels = new byte[BoxWidth * BoxHeight * BytesPerPixel]; for (int i = 0; i < Pixels.Length; i += 4) { Pixels[i + 0] = Blue; Pixels[i + 1] = Green; Pixels[i + 2] = Red; Pixels[i + 3] = 0; } int Stride = BoxWidth * BytesPerPixel; Int32Rect DrawBox = new Int32Rect(X, Y, BoxWidth, BoxHeight); ImageSource.Lock(); ImageSource.WritePixels(DrawBox, Pixels, Stride, 0); ImageSource.Unlock(); } 

它的工作原理,我的video在屏幕上播放,但它是sloooooooow。 无处接近实时播放速度。 有没有更好的方法,除了在程序上生成一系列位图,这样做,我没有看到? 我已经阅读了有关D3Dimage的内容,但似乎更多的是将3D场景导出到位图。 这里的建议?

如果我理解正确,您会收到一个16 * 16像素的块作为捕获,在上面的示例中,您将更新每个更新的可写位图。

这看起来像很多流失,因为每个块都会触发渲染。

是不是更好:

通过这种方式,渲染的流失率会大大降低,因为您不会为每个块触发渲染,但仅针对每个帧。

更新1

如果您不使用Alpha通道,我还会考虑使用Bgr24作为像素格式。 这样,每个像素将有3个字节,而不是4个字节,因此开销会大大减少。

更新2

如果对于较大的帧大小而言仍然太慢,您还可以考虑以下因素增加了复杂性。

考虑维护和翻转两个帧缓冲区。 通过这种方式,您可以在后台线程上合成帧,然后在UI线程上对完成的帧进行blit。 Whist UI线程正在渲染帧,您可以继续在替代缓冲区上进行合成。

更新3

如果捕获的像素颜色信息数组格式正确,则可以尝试使用Buffer.BlockCopy将源像素数组批量复制到帧缓冲区数组中。 您必须将位图格式保留为bgr32。 这种低级别的arrays复制技术可以带来一些性能提升。

上述就是C#学习教程:在WPF中生成和绘制video的快速方法是什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1000279.html

(0)
上一篇 2021年12月27日
下一篇 2021年12月27日

精彩推荐