我实现了一个 C# 应用程序,以 30fps 的帧速率接收帧 RGB。
帧到达事件是用以下代码管理的:
void client_ColorFrameReady(object sender, ColorFrameReadyEventArgs e)
{
mycounter++;
Console.WriteLine("new frame received: " + mycounter);
if (writer != null)
{
count++;
if (count % 2== 0)
{
using (var frame = BitmapImage2Bitmap(e.ColorFrame.BitmapImage))
using (var thumb = ResizeBitmap(frame, 320, 240))
{
writer.WriteVideoFrame(thumb);
}
}
}
else
{
writer.Close();
}
}
使用 if 条件我只管理两个框架之一。
当我的代码调用
BitmapImage2Bitmap
时,我收到此异常:
英语的例外应该是:
A first chance exception of type 'System.NotSupportedException' occurred in `PresentationCore.dll`
Additional information: BitmapMetadata is not available on BitmapImage.
奇怪的是,我的应用程序运行得“很好”,因为帧已正确插入到输出文件中。
我已经阅读了this,所以这个问题似乎是WPF框架中的一个错误。
这是设计使然。第一次机会异常通知并不意味着存在问题。 Create()方法内的相关代码如下所示:
try
{
metadata = source.Metadata as BitmapMetadata;
}
catch (NotSupportedException)
{
}
换句话说,异常是预料之中的,并且只是被吞掉了。这当然非常烦人,因为当您在“调试 + 异常”对话框中选中“抛出”复选框时,这些异常 do 会使调试器停止。但这肯定不是一个错误,这是故意这样写的。有时,直接引发异常并吞掉它比编写阻止异常的代码要便宜得多。特别是当避免异常变得不切实际时,例如位图的情况,因为有许多不同类型的位图类型。其中一些不支持元数据。无论在框架代码中的何处完成此操作,几乎总是为了使代码更快。速度也是代码的一个重要方面。
功能,而不是错误。取消选中“抛出”复选框以避免看到这些异常。
希望我的回答对你有帮助。
我使用了相同的代码,但是当我们使用
BitmapFrame.Create(source)
时,PresetationCore.dll 抛出异常。
所以,我正在使用 BitmapFrame.Create 函数的另一个重载:
public static BitmapFrame Create(
BitmapSource source,
BitmapSource thumbnail,
BitmapMetadata metadata,
ReadOnlyCollection<colorcontext> colorContexts
)
我们可以用
BitmapFrame.Create(source, null, null, null).
得到相同的结果
就您而言:
enc.Frames.Add(BitmapImage.Create(bitmap, null, null, null));
使用 .NET Framework 4.5 运行,我必须将 Microsoft SDK WPF 照片查看器示例中的类似行更改为
_image = BitmapFrame.Create(_source);
到
_image = BitmapFrame.Create(_source, BitmapCreateOptions.None, BitmapCacheOption.None);
避免 ConfigurationErrorsException。事情似乎在幕后发生……
我最近在处理项目中作为资源包含的图像时遇到了这个问题(BuildType=文件属性中的资源)。这似乎是一些与构建相关的问题,导致资源损坏,并在 WPF 加载资源时导致看似随机的问题。只需执行清理/重建即可使错误消失。虽然添加新图像时它们可能会重新出现,但显然同样的修复适用。