使用AFORGE在c#中录制视频

本文关键字:视频 AFORGE 使用 | 更新日期: 2023-09-27 18:16:42

我尝试了以下方法,以每秒25帧率记录视频,持续10秒,但当我得到输出视频时,它是2秒,帧播放速度比视频流快。

代码如下:

    using System;
using System.Drawing;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using System.Threading;
using AForge.Video.FFMPEG;
namespace AforgeTutorial
{
    public partial class Form1 : Form
    {
        private FilterInfoCollection ListOfCams;
        private VideoCaptureDevice SelectedCam; //From where we will take image
        System.Timers.Timer tim;
        Thread t;
        bool isNewFrame = false;
        VideoFileWriter writer;
        public Form1()
        {
            InitializeComponent();
            tim = new System.Timers.Timer(10000);
            tim.Elapsed += new System.Timers.ElapsedEventHandler(tim_Elapsed);
            t = new Thread(saveVideo);
        }
        void tim_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (isRecord)
            {
                writer.Close();
                isRecord = false;
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            ListOfCams = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (ListOfCams.Count == 0)
                return;
            comboBox1.Items.Clear();
            foreach (FilterInfo Cam in ListOfCams)
            {
                comboBox1.Items.Add(Cam.Name);
            }
        }
        private void StopCamera()
        {
            SelectedCam.SignalToStop();
            SelectedCam.Stop();
        }
        bool isRecord = false;
        private void Start_Click(object sender, EventArgs e)
        {
            if (comboBox1.Text == string.Empty)
                return;
            SelectedCam = new VideoCaptureDevice(ListOfCams[comboBox1.SelectedIndex].MonikerString);
            SelectedCam.NewFrame += new NewFrameEventHandler(SelectedCam_NewFrame);
            SelectedCam.Start();
        }
        Bitmap image;
        void SelectedCam_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            image = (Bitmap)eventArgs.Frame.Clone();
            isNewFrame = true;
            pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();            
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            StopCamera();
        }
        private void Stop_Click(object sender, EventArgs e)
        {
            StopCamera();
        }
        private void btnRecord_Click(object sender, EventArgs e)
        {
            tim.Start();
            if (!isRecord)
            {
                writer = new VideoFileWriter();
                writer.Open(@"C:/code-bude_test_video.mp4", 640, 480, 25, VideoCodec.MPEG4,10000);
            }
            isRecord = !isRecord;
            if (isRecord)
                t.Start();
        }
        void saveVideo()
        {
            while (isRecord)
            {
                if (isNewFrame)
                {
                    writer.WriteVideoFrame(image);
                    isNewFrame = false;
                }
            }
        }
    }
}

使用AFORGE在c#中录制视频

您的代码中存在多线程问题。你不能像这样写入共享变量,并期望它同步。

你有三个线程:用户界面,流和保存。(SelectedCam_NewFrame在AForge流线程中运行)。列出至少在两个线程(isRecord, isNewFrame等)中访问的所有变量,并添加适当的同步。

你可以查看这个非常好的c#线程参考。

请注意,即使有同步,如果您的写入线程在几个图像到达时很忙,您可能会错过帧。您可能想要做的是将相机生成的帧收集到队列中,并在写入线程中使用该队列。查看生产者/消费者模式