我正在编写一个视频播放器,用于播放我们ASIC捕获的帧。它们是自定义格式的,我已经有了一个解码ASIC状态的函数。视频大小可以是从640x480到2560x1200的任意尺寸。每个状态周期的输出是一个16x16像素块,我必须将其放入屏幕上的视频中。
每次屏幕需要更新时,我会得到以下信息:
- 块宽度 - 块高度 - 块起始点的X坐标 - 块起始点的Y坐标 - 一个RGB32像素颜色信息的一维数组
主要限制如下:
- .NET 3.5 - 不能使用不安全代码
今天上午我尝试使用WriteableBitmap,并将其用作Image的源,类似于以下方式:
每次屏幕需要更新时,我会得到以下信息:
- 块宽度 - 块高度 - 块起始点的X坐标 - 块起始点的Y坐标 - 一个RGB32像素颜色信息的一维数组
主要限制如下:
- .NET 3.5 - 不能使用不安全代码
今天上午我尝试使用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();
}
功能能实现,我的视频正常播放,但速度太慢了。根本不能达到实时播放的速度。有没有更好的方法来解决这个问题,而不是程序生成一系列位图?我已经读到一些关于D3Dimage的东西,但似乎那更多用于将3D场景导出为位图。有什么建议吗?