Ошибка при выводе видео с usb камеры

Пытаюсь вывести изображение с камеры на экран. Использую библиотеку Aforge. Перенёс рекомендуемый код в свой проект.

public Form1()
    {
        InitializeComponent();

        toolStripComboBox1.SelectedIndexChanged += ToolStripComboBox1_SelectedIndexChanged;
        toolStripButton1.Click += ToolStripButton1_Click;
        toolStripButton2.Click += ToolStripButton2_Click;
    }

    FilterInfoCollection fic = new FilterInfoCollection(FilterCategory.VideoInputDevice);

    VideoCaptureDevice vcd;

    private void ToolStripButton2_Click(object sender, EventArgs e)
    {
        vcd.Stop();
    }

    private void ToolStripButton1_Click(object sender, EventArgs e)
    {
        vcd.NewFrame += Vcd_NewFrame;
        vcd.Start();
    }

    private void Vcd_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
    }

    private void ToolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        vcd = new VideoCaptureDevice(fic[toolStripComboBox1.SelectedIndex].MonikerString);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        for(int i = 0; i < fic.Count; i++)
        {
            toolStripComboBox1.Items.Add(fic[i].Name);
        }
    }

При запуске видео-потока возникает следующая ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'panel1' не из того потока, в котором он был создан." picturebox1 лежит на panel1.

Частично проблему решает вот такой код в событии нового кадра, но тогда программа закрывается с ошибкой и не выгружается процесс.

   if (pictureBox1.InvokeRequired)
             this.Invoke(new Action(() => {
                pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
                }));
       else
            pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();

выпадает вот такая ошибка: System.ObjectDisposedException: "Доступ к ликвидированному объекту невозможен. Имя объекта: "Form1"." На строке

this.Invoke(new Action(() => {                     
pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();                     
}));

В обработчике закрытия формы у меня вот так:

if (vcd.IsRunning) vcd.SignalToStop();

В предыдущих проектах этот код работал без каких-либо проблем. Что может вызывать эту ошибку? Какие ещё c# библиотеки можно использовать для вывода видео с юсб камеры?


Ответы (1 шт):

Автор решения: Dima V

В библиотеке Aforge.Controls есть специальный контрол videoSourcePlayer для вывода видео. Заменив picturBox на него и приделав к нему VideoSourceDevice, всё замечательно заработало как надо безо всяких Invoke и заморочек с потоками.

запуск видео потока:

     vcd = new VideoCaptureDevice(fic[selectedCamId].MonikerString);
    
     videoSourcePlayer1.VideoSource = vcd;
    
     vcd.Start();

И всё же я уверен, что раньше это работало через событие нового кадра.

→ Ссылка