wpf 如何从Aforge录制的视频文件中删除帧

k4emjkb1  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(172)

我必须用AForge通过软件实现闭路电视电路。我可以用

private VideoFileWriter FileWriter = new VideoFileWriter();

并写入一个新帧

private void LocalWebCam_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
   try
   {
      Image img = (Bitmap)eventArgs.Frame.Clone();

       MemoryStream ms = new MemoryStream();
       img.Save(ms, ImageFormat.Bmp);
       ms.Seek(0, SeekOrigin.Begin);
       bi = new BitmapImage();
       bi.BeginInit();
       bi.StreamSource = ms;
       bi.EndInit();

       bi.Freeze();
       Dispatcher.BeginInvoke(new ThreadStart(delegate
       { frameHolder.Source = bi; }));

       FileWriter.WriteVideoFrame(BitmapImage2Bitmap(bi));
   }
   catch (Exception ex)
   {}
}

因此,通过帧添加写入文件是可以的。
因此,为了不填补高清与巨大的文件,我决定,例如,当avi文件达到10 MB,它被分割成一个新的文件

  1. avi被重命名为2.avi并启动一个新文件
  2. avi --〉2.avi
    那么
    1.动画--〉2.动画--〉3.动画
    等等。最终当我有1.avi 2.avi... 10.avi 11.avi我会删除11.avi所以总是有10个文件。一个滚动系统。这工作,但不是聪明的所有。
    什么将是伟大的,而不是文件分割时,达到一定的大小,我继续添加新的帧在年底,我删除新的帧在开始,使整个avi文件大小不超过一定的大小,我总是有最后几分钟的注册

k10s72fa

k10s72fa1#

我不确定是否存在这样的功能,但是你可以尝试一种不同的方法,将位图帧存储为缓冲区,并在需要的时候创建一个VideoFileWriter
你可以创建一个类来将帧存储为一个Bitmap数组,然后在你想要的时候将它作为一个视频。

public class CustomVideoBuffer
    {
        public readonly int BufferSize;
        protected readonly Bitmap[] Buffer;
        protected int currentFrame;
        public CustomVideoBuffer(int bufferSize = 100)
        {
            BufferSize = bufferSize;
            Buffer = new Bitmap[BufferSize];
            currentFrame = 0;
        }
        public void AddFrame(Bitmap image)
        {
            Buffer[currentFrame++] = image;
            currentFrame %= BufferSize;
        }
        public VideoFileWriter GetVideo()
        {
            var FileWriter = new VideoFileWriter(); // Create an instance here
            int frame = currentFrame;
            do
            {
                var img = Buffer[++frame];
                if (img!=null) 
                    FileWriter.WriteVideoFrame(img);
                frame %= BufferSize;
            } while (frame != currentFrame); // start from (currentFrame+1), and cycle all frames till currentFrame
            return FileWriter;
        }
    }

接下来,在程序中创建此类的一个示例

CustomVideoBuffer myBuffer = new CustomVideoBuffer(300); // Create a buffer of size 300

然后,如图所示逐个添加帧

private void LocalWebCam_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
   try
   {
       // Get Bitmap converted from the eventArgs
       Bitmap img = (Bitmap)eventArgs.Frame.Clone();

       myBuffer.AddFrame(img); // Add the frame to the buffer
   }
   catch (Exception ex) { ... }
}

最后,完成后,只需使用以下命令从缓冲区获取准备好的VideoFileWriter(

VideoFileWriter FileWriter = myBuffer.GetVideo();

相关问题