Ошибка при выводе видео с 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 шт):
В библиотеке Aforge.Controls есть специальный контрол videoSourcePlayer для вывода видео. Заменив picturBox на него и приделав к нему VideoSourceDevice, всё замечательно заработало как надо безо всяких Invoke и заморочек с потоками.
запуск видео потока:
vcd = new VideoCaptureDevice(fic[selectedCamId].MonikerString);
videoSourcePlayer1.VideoSource = vcd;
vcd.Start();
И всё же я уверен, что раньше это работало через событие нового кадра.