You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#流媒体视频快速缩放方案咨询:解决FPS骤降问题

快速解决AForge.NET摄像头流缩放后FPS下降的问题

你的问题核心在于两点:Graphics.DrawImage默认启用高质量渲染导致缩放效率低,以及未释放旧图像资源引发的内存泄漏(这是FPS随运行时长持续降低的关键原因)。以下是针对低画质需求的快速优化方案:

1. 改用最快的缩放渲染模式

修改你的ResizeImage方法,禁用高质量渲染选项,使用最快的邻近插值算法,完全满足低画质下的快速降采样需求:

public Image ResizeImage(Image img, int target_width, int target_height)
{
    // 计算保持宽高比后的目标尺寸
    int scaledWidth = (int)(target_height * img.Width / (float)img.Height);
    
    Bitmap scaledBitmap = new Bitmap(scaledWidth, target_height);
    using (Graphics g = Graphics.FromImage(scaledBitmap))
    {
        // 设置最快的渲染参数
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
        g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighSpeed;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
        
        // 绘制缩放后的图像并居中
        g.DrawImage(img, (target_width - scaledWidth) / 2, 0, scaledWidth, target_height);
    }
    return scaledBitmap;
}

2. 修复内存泄漏问题

每次给picVideo.Image赋值时,旧的Bitmap资源未被释放,导致内存占用持续升高,最终拖慢FPS。修改video_NewFrame方法,手动释放旧资源:

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    Invoke(new Action(() =>
    {
        // 保存旧图像,赋值新图像后释放
        Image oldImage = picVideo.Image;
        picVideo.Image = ResizeImage((Bitmap)eventArgs.Frame.Clone(), picVideo.Width, picVideo.Height);
        oldImage?.Dispose();
    }));
}

3. 优先使用摄像头硬件缩放(最优方案)

如果你的摄像头支持直接输出目标分辨率,让硬件完成缩放是效率最高的方式,完全避免软件层面的图像处理开销:

filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);
videoCaptureDevice = new VideoCaptureDevice(filterInfoCollection[frmMain.Camera].MonikerString);

// 查找最接近目标高度的分辨率
var targetResolution = videoCaptureDevice.VideoCapabilities
    .OrderByDescending(cap => cap.FrameSize.Height <= picVideo.Height)
    .FirstOrDefault();

if (targetResolution != null)
{
    videoCaptureDevice.VideoResolution = targetResolution;
}

videoCaptureDevice.NewFrame += video_NewFrame;
videoCaptureDevice.Start();

以上方案中,优先尝试硬件缩放,其次结合软件快速渲染+内存泄漏修复,就能达到和第三方EXE相近的流畅度。

内容的提问来源于stack exchange,提问作者Jackie Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:54:24