Почему запускается только один из моих обработчиков событий?

#c# #aforge

#c# #aforge

Вопрос:

Я хотел бы одновременно записывать видео с двух веб-камер. Я использую Aforge.Видео.Пакет DirectShow для захвата каждого кадра из веб-игр. Я начал с примера, показанного на их веб-сайте, и просто добавил вторую камеру.

Но проблема, с которой я сталкиваюсь, заключается в том, что запускается только один из обработчиков событий для обработки новых кадров. В приведенном ниже примере кода это _NewFrameHandler2.

У меня такое чувство, что я упускаю здесь что-то очевидное…

 public class Camera
{
    private VideoCaptureDevice objCamera1;
    private VideoCaptureDevice objCamera2;

    public void Start()
    {
        FilterInfoCollection objVideoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        objCamera1 = new VideoCaptureDevice(objVideoDevices[0].MonikerString);
        objCamera2 = new VideoCaptureDevice(objVideoDevices[1].MonikerString);

        objCamera1.VideoResolution = objCamera1.VideoCapabilities[objCamera1.VideoCapabilities.Count() - 1];
        objCamera2.VideoResolution = objCamera2.VideoCapabilities[objCamera2.VideoCapabilities.Count() - 1];


        objCamera1.NewFrame  = new NewFrameEventHandler(_NewFrameHandler1);
        objCamera2.NewFrame  = new NewFrameEventHandler(_NewFrameHandler2);

        objCamera1.Start();
        objCamera2.Start();   
    }

    public void Stop()
    {
        objCamera1.Stop();
        objCamera2.Stop();
    }


    private void _NewFrameHandler1(object sender, NewFrameEventArgs eventArgs)
    {

        Bitmap objFrame = (Bitmap)eventArgs.Frame;
        Console.WriteLine("1");
    }

    private void _NewFrameHandler2(object sender, NewFrameEventArgs eventArgs)
    {

        Bitmap objFrame = (Bitmap)eventArgs.Frame;
        Console.WriteLine("2");
    }
}
  

Комментарии:

1. Возможно, вы захотите изучить TPL / многозадачность. Это может быть проблема с потоками.

2. Спасибо за отзыв @Kixoka Я еще немного поэкспериментировал и обнаружил, что функция objCamerax.Start() определяет, какой обработчик событий выполняется. Последний запущенный — это тот, который на самом деле запущен. Так что, похоже, это проблема с пакетом Aforge, возможно. Я заглянул в функцию Start(), и все, что они там делают, это запускают новый поток, который затем считывает кадры с камеры.

3. К вашему сведению, AForge больше не поддерживается и был поглощен проектом Accord. По сути, это обычная замена (хотя, конечно, пространства имен изменились).

4. Спасибо за информацию, Эми, я перенес ее в Accord!

Ответ №1:

Я думаю, что я понял это. Я добавил задержку в 500 мс между вызовом .Функция Start() для объектов camera.

 System.Threading.Thread.Sleep(500);
  

Теперь это работает.

Комментарии:

1. Вы можете принять свой собственный ответ, чтобы закрыть его. Ну, на самом деле он не совсем закрыт, но люди видят, что на него был дан ответ.