Capture Camera Feed с устройства EasyCap 4ch USB DVR с использованием DirectShow и DirectX.Capture C#

Я пытаюсь перехватить видеокамеру с устройства 4-канального USB DVR EasyCap, которое я недавно получил
и я купил монохромную / цветную камеру Super Mimi и подключил ее к устройству DVR, сумел правильно настроить устройство с драйвером "SMI Grabber" и установил программное обеспечение, которое поставляется с устройством "SuperViewer"
и я написал простое приложение формы Windows, которое содержит PictureBox чтобы посмотреть канал камеры
(Есть правка внизу)
Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DirectX.Capture;


namespace DirectShowWithCrossbar
{
    public partial class Form1 : Form
    {
        private CrossbarSource crossbar;
        private Filters filters;
        private Capture capture;
        public Form1()
        {
            InitializeComponent();

            filters = new Filters();
            capture = new Capture(filters.VideoInputDevices[0], filters.AudioInputDevices[0]);
            foreach (Filter device in filters.VideoInputDevices)
            {
                comboBox1.Items.Add(device);
            }
            if (comboBox1.Items.Count > 0)
                comboBox1.SelectedIndex = 0;
            foreach (Filter device in filters.AudioInputDevices)
            {
                comboBox2.Items.Add(device);
            }
            if (comboBox2.Items.Count > 0)
                comboBox2.SelectedIndex = 0;
            foreach (Source source in capture.VideoSources)
            {
                comboBox3.Items.Add(source);
            }
            if (comboBox3.Items.Count > 0)
                comboBox3.SelectedIndex = 0;
            ShowPropertPagesInMenuStrip();
            crossbar = (CrossbarSource)capture.VideoSource;
            crossbar.Enabled = true;
            capture.PreviewWindow = pictureBox1;
        }

        private void ShowPropertPagesInMenuStrip()
        {
            foreach (PropertyPage pro in capture.PropertyPages)
            {
                menusToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem(pro.Name));
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            capture.Cue();
            capture.Start();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            capture.Stop();
            capture.Dispose();
        }

        private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {
            capture.VideoSource = (Source)comboBox3.SelectedItem;
        }
    }
}

и я получил черный экран в окне изображения??
Черный экран без канала
Super Viewer Software работает и по ошибке после закрытия моего приложения я запустил приложение SuperViewer, которое поставляется с устройством DVR, а затем открыл свое приложение, после чего мое окно с картинками начало показывать мне канал с камеры, странно!!! и канал из оригинального программного обеспечения зависает!
И мое программное обеспечение, и SuperViewer, работающий на моем, работает, другое зависает Пример и источники DirectX.Capture попытались с тем же результатом http://www.codeproject.com/Articles/3566/DirectX-Capture-Class-Library
и я также использовал OpenCV и Touchless, и я получил тот же результат:(
Редактировать:
Я искал и обнаружил, что мне нужно получить фильтр (IAMCrossbar). Я думаю, что это проблема USB-камеры DirectShow, меняющей источник видео, и после применения изменений в этой ссылке в DirectX.Capture Wrapper я все равно получаю те же результаты:(
Спасибо за любую помощь, заранее Ясер

1 ответ

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

Если вы хотите придерживаться Directshow(как другие предлагали OpenCV), то я бы предложил,

  1. Попробуйте собрать весь код, связанный с захватом, в DLL C++/CLI,
  2. Создайте весь свой пользовательский интерфейс в C#.

Вы можете взять этот пример проекта MP3 Player в качестве отправной точки для вашего DLL.

Для захвата AmCap является подробным примером.

Я имею в виду, что вам нужно получить код захвата из AmCap в вышеупомянутый DLL-файл MP3 Player и открыть его для своего приложения на C#.

Другие вопросы по тегам