带远程处理的C#网络摄像头

时间:2012-11-19 17:42:16

标签: webcam remoting marshalbyrefobject

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

    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;
    }

0 个答案:

没有答案