-1

私は自分の Web カメラをいじっていて、(Microsoft Expression Encoder SDK を使用して) 小さなアプリケーションの作成を開始しました。このアプリケーションでは、Web カメラの画像が winform の画像ボックスにストリーミングされます [1]。これまでのところ、すべてが非常にスムーズに進みました。しかし、今私の問題が始まります:

ビデオストリームの単一の画像をキャプチャして保存したい。ビデオファイルを作成できる「ScreenCaptureJob」クラスを見つけました。Microsoft の MSDN は、「ダイアログ ボックスの静止画像から何でもキャプチャする」ことが可能であると述べています [2]。MSDN のすべてのサンプルは、ビデオ キャプチャに関するものです。残念ながら、このクラスを使用して単一の画像をキャプチャする方法を見つけることができませんでした。

誰でも私を助けることができますか?

[1] ウェブカメラを画像ボックスにストリーミングするコード (出典: http://www.codeproject.com/Articles/202464/How-to-use-a-WebCam-in-C-with-the-NET-Framework-4 )

        var lstVideoDevices = new Dictionary<string, EncoderDevice>();
        var lstAudioDevices = new Dictionary<string, EncoderDevice>();

        foreach (EncoderDevice edv in EncoderDevices.FindDevices(EncoderDeviceType.Video))
        {
            lstVideoDevices.Add(edv.Name, edv);
        }
        foreach (EncoderDevice eda in EncoderDevices.FindDevices(EncoderDeviceType.Audio))
        {
            lstAudioDevices.Add(eda.Name, eda);
        }

        _job = new 

        var _deviceSource = _job.AddDeviceSource(lstVideoDevices.Values.FirstOrDefault(x => x.Name.Contains("USB")), lstAudioDevices.Values.FirstOrDefault(x => x.Name.Contains("USB")));

        _deviceSource.PreviewWindow = new PreviewWindow(new HandleRef(this.pictureBox1, this.pictureBox1.Handle));

        _job.ActivateSource(_deviceSource);`

[2] http://msdn.microsoft.com/en-us/library/gg602440%28v=expression.40%29.aspx

4

2 に答える 2

2

静止画のキャプチャにライブラリを使用できますが、少し手間がかかるようです。(私はまだより良い解決策を探しています)リンクで例を見つけました 基本的な解決策は、プレビュー ウィンドウをポップアップし、同じサイズのグラフィックス オブジェクトを使用して、CopyFromScreen() を使用してファイルを取得することです。

できますが、少し面倒なようです。Code Project-How To Use A Webcam in C# で例を見つけました 。基本的な解決策は、プレビュー ウィンドウをポップアップ表示することです。次に、同じサイズのグラフィックス オブジェクトを使用して、CopyFromScreen() を使用してファイルを取得します。コードは次のとおりです。

using (Bitmap bitmap = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height))
   { 
   using (Graphics g = Graphics.FromImage(bitmap))
    {
        // Get the paramters to call g.CopyFromScreen and get the image
        Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds;
        Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y));
        g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size); 
    }
    bitmap.Save(....)
    }
于 2013-09-10T06:09:29.110 に答える
1

Microsoft Expression Encoder SDK で可能かどうかはわかりませんが、文書化が不十分なようです。

ただし、代わりにビデオ キャプチャ機能を使用できます。

関数を使用してプレビュー ウィンドウを作成し、メッセージcapCreateCaptureWindowを送信してフレーム コールバックを登録するだけです。WM_CAP_SET_CALLBACK_FRAME

/* imports */
[DllImport("user32", EntryPoint="SendMessage")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

[DllImport("avicap32.dll", EntryPoint="capCreateCaptureWindowA")]
public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);

/* ... */
capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE | showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);

SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, handler);

C# の例は、ここここにあります。

Expression Encoder でそれを行う方法がわかった場合は、お知らせください。

于 2013-05-05T15:04:17.310 に答える