【问题标题】:Capture desktop with Aforge使用 Aforge 捕获桌面
【发布时间】:2022-01-03 18:54:09
【问题描述】:

我看过各种教程,例如 this,关于如何从网络摄像头制作视频、显示和录制视频。 我现在想要的是能够对桌面做同样的事情,这样我就可以与外部世界交叉引用计算机活动。 所以我想要的是能够记录在计算机上发生的事情的视频,可能使用 AForge。 我没有找到关于这方面的参考,因此不可能使用 Aforge 吗?

--添加--

我已实施如下建议的解决方案:

谢谢

但是当我查看 png 时全是黑色的。 当我保存网络摄像头框架时,保存过程是正确的。你能告诉我我对你的代码的改编有什么问题吗?

谢谢

【问题讨论】:

  • 您是指交叉引用的“类似缩放”的应用程序吗?
  • 我只是想看看用户在特定时间做了什么以及在现实世界中发生了什么
  • 那么,您的意思是实时桌面共享?如果是这样,它可能与 Aforge.NET 无关。因为您需要捕获屏幕并通过互联网共享,对吗?
  • FFMpeg wiki/manual 有一个“如何捕获桌面”部分。我只是要求 ffmpeg 将您的桌面捕获为一个流,将您的 cam 捕获为另一个,混合到同一个文件中

标签: c# wpf video desktop aforge


【解决方案1】:

它可能不是专业的解决方案,也不是实时的,但它适用于像您这样的简单场景。它是使用 Net Framework 4.7.2 构建的控制台应用程序。我使用它的源代码重建了程序集Aforge.Video.FFMPEG,以便它可以与 Net Framework 4.0+ 一起使用。

using AForge.Video.FFMPEG;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

class Program
    {
        static VideoFileWriter VideoFileWriter;
        static Stopwatch stopwatch = new Stopwatch();
        static void Main(string[] args)
        {
            VideoFileWriter = new VideoFileWriter();

            Size screenSize = Screen.PrimaryScreen.Bounds.Size;
            VideoFileWriter.Open("test.mp4", screenSize.Width, screenSize.Height, 30, VideoCodec.MPEG4, 19200000);
            Bitmap bitmap = new Bitmap(screenSize.Width, screenSize.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            Graphics g = Graphics.FromImage(bitmap);
            stopwatch.Start();
            while (stopwatch.Elapsed < TimeSpan.FromSeconds(10)) // Record for ten seconds.
            {
                g.CopyFromScreen(0, 0, 0, 0, screenSize, CopyPixelOperation.SourceCopy);
                VideoFileWriter.WriteVideoFrame(bitmap, stopwatch.Elapsed);
                Thread.Sleep(29);
            }
            VideoFileWriter.Close();
            g.Dispose();
        }
    }

【讨论】:

  • 能否请您解释一下 Thread.Sleep(29) 的用途;命令?如果是做VideoFileWriter,是不是放低帧率比较好?
  • 我已经实现了您的解决方案,但即使看起来不错,它也会产生全黑图像。你能告诉我哪里错了吗?谢谢
  • 它的目的是等待某个时间直到下一帧,在本例中为 30ms。由于 Thread.Sleep 不保证它会准确睡眠 30 毫秒,因此在实践中,您应该选择低于 30 毫秒。顺便说一句,我没有选择正确的值。是的,最好以高帧率捕获桌面。你可以随心所欲地调整它。但是捕获的运行时间必须大约或低于 30 毫秒。 Graphics.CopyFromScreen 还不错,但速度不够快。您可以搜索其他选项以在 SO 上捕获桌面。
  • 它不会在我的双显卡笔记本电脑上产生任何黑色图像。这可能是由您的桌面呈现方式(CPU 或 GPU)引起的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多