c# - C# FFmpeg 位图帧到图片框
问题描述
我有一个现有的 C# winforms 应用程序,其中包含通过 VLC.net (rtsp) 来自 4 个 ip 摄像机的实时视频流,我们每 100 毫秒拍摄一次快照以进行分析。这工作正常。现在我们喜欢用 FFmpeg 代替 VLC.net 来实现(更快)捕获帧的更多可能性。我已经有一个工作的 ffmpeg 包装器通过事件将每一帧作为位图发送。然后我有一个继承自PictureBox的类“FmpegVideoWindow”,这里我们监听传入的帧并将它们绘制在picturebox上。因此,我们现在使用图片框的形式代替使用 vlc-control :
private void ffMpegWrapper_NewFrame1(object sender, NewFrameEventArgs e)
{
if (e != null)
{
try
{
using (Bitmap bm = new Bitmap(e.Frame))
{
frame = (Bitmap)bm.Clone();
}
}
catch
{
}
}
Invalidate();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
if (frame != null)
{
pe.Graphics.DrawImage(frame, 0, 0, this.Width, this.Height);
//todo : disposing frame
}
}
可以正常观看摄像机,它们具有@25fps 和 D1 分辨率 704*576。问题是每次我们进行其他处理,例如打开(设置)表单或分析快照时,图片框中的图片都会冻结一小段时间。与 VLC.net 相同的程序从来都不是问题。
Ffmpeg 进程在另一个线程中完成。为什么 VLC.net 控件在 GUI 线程中运行流畅,而这种新方法却不行?我们能做些什么来解决它?分析也在另一个线程中完成,将分析器的结果写入数据库是在 GUI 线程中完成的。而且我不喜欢改变它,因为使用 VLC.net 也不需要这样做。先感谢您。
解决方案
推荐阅读
- macos - MacOS终端 - 错误的光标位置
- css - 您可以将详细信息元素设置为显示网格吗?
- c# - 为什么我的编译器警告只有一个被禁止?
- python - 为什么 datetime 为同一时区提供不同的时区格式?
- python - 可以自动将新数据从服务器下载到我的本地备份的脚本
- android - 如何更新应用程序使用的外部文件?
- python-3.x - 如何更改 exec() 函数中变量的值?
- vba - excel vba中带有自动完成/建议的下拉列表
- microsoft-graph-api - OneDrive 中的节流
- c# - 使用 SqlDatRecord 结果列表插入行 数据库中的外键错误