3

私のプロジェクトはリモーティングに関するもので、ウェブカメラ コンポーネントを追加したいと考えています。これは次のとおりです。私のソリューションには 3 つのプロジェクトがあります... Client、Server、Remote.dll。Remote.dll は、サーバー マシンで動作するメソッドを持つ一般的なクラスです。クライアントからこれらのメソッドを呼び出すと、サーバー側で実行されます。だから今私の質問は、Webcamのコードをremote.dllに入れ、Webcamが画像をキャッチするたびに機能する「video_NewFrame」というイベントがあることです。しかし、コードがこのイベントに落ちると無限に実行され、クライアント側のタイマーも機能しないため、クライアント側から画像に到達できません。イメージをグローバル変数に割り当てようとしましたが、コードがクライアントに送信され、Remote.dll に再び送信されるたびに、変数が null になります...クライアントから同時にキャプチャされた画像にアクセスするにはどうすればよいですか? ここに私のコードがあります:

    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