3

我的项目是关于远程处理的,我想向它添加一个网络摄像头组件。在这里:我的解决方案中有 3 个项目...客户端、服务器、Remote.dll。在 Remote.dll 中是一个通用类,它具有在服务器机器上工作的方法。当我从客户端调用这些方法时,它在服务器端执行。所以现在我的问题是我将网络摄像头的代码放在 remote.dll 中,它有一个名为“video_NewFrame”的事件,每次网络摄像头捕捉到图像时它都会起作用。但是我无法从客户端访问图像,因为当代码下降到此事件时,它会无限执行,并且客户端中的计时器也无法正常工作。我试图将图像分配给我的全局变量,但是每当代码进入客户端并再次进入 Remote.dll 时,我的变量为空...如何从客户端同时获取捕获的图像?这是我的代码:

    private bool DeviceExist = true;
    private FilterInfoCollection videoDevices;
    private VideoCaptureDevice videoSource = null;

    public bool WebCamStart(int DeviceIndex)
    {
        if (DeviceExist)
        {
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            //string myDevice = videoDevices[0].Name;
            videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
            videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);

            CloseVideoSource();
            videoSource.DesiredFrameSize = new Size(640, 480);
            //videoSource.DesiredFrameRate = 10;
            videoSource.Start();
            return true;
        }
        else return false;
    }

    public Bitmap lastImg;

    private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Bitmap img = (Bitmap)eventArgs.Frame.Clone();
        //in executes infinitely when execution comes here and i cant reach from Cliend side...
    }


    public string getFPS()
    {
        return videoSource.FramesReceived.ToString();
    }

    public void CloseVideoSource()
    {
        if (!(videoSource == null))
            if (videoSource.IsRunning)
            {
                videoSource.SignalToStop();
                videoSource.Stop();
                videoSource = null;
            }
    }

    public string getCamList()
    {
        string result = "No Device Found";
        try
        {
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            //comboBox1.Items.Clear();
            if (videoDevices.Count == 0)
                throw new ApplicationException();

            DeviceExist = true;
            foreach (FilterInfo device in videoDevices)
            {
                //comboBox1.Items.Add(device.Name);
                result = device.Name;
                return result;
            }
            //comboBox1.SelectedIndex = 0; //make dafault to first cam
        }
        catch (ApplicationException)
        {
            DeviceExist = false;
            //comboBox1.Items.Add("No capture device on your system");
            return "No capture device on your system";
        }
        return result;
    }

//和我的客户端...

    private void timerWebCam_Tick(object sender, EventArgs e)
    {
        //lblFPS.Text ="Device Running... " + remObj.getFPS() + " FPS";
        pictureBox1.Image = remObj.lastImg;
    }
4

0 回答 0