10

PC に接続されたカメラにアクセスし、ビデオを録画し、ビデオから画像を取得できるアプリケーションを作成しようとしています。AForge.NET ライブラリを使用してカメラにアクセスします: http://www.aforgenet.com/framework/

AForge.Video.NewFrameEventHandler という名前のイベントがどのように機能するかわかりません。このコードでは、イベントはビデオからの新しいフレームではなく、ビットマップに null を返します。または、イベントは呼び出されません。ビデオストリームのようなものを作成するためにフレームごとにビデオからピクチャボックスにフレームを取得したいのですが、停止ボタンをクリックした後、最後の画像がピクチャボックスに表示されたままになります。誰も方法を知っていますか?そして、なぜ私のコードが機能しないのですか?

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AForge.Video.DirectShow;
using System.Drawing;
using AForge.Video;

namespace CameraDevice
{
    public class CameraImaging
    {
        // enumerate video devices
        public FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice );
        //camera
        public VideoCaptureDevice videoSource;
        //screen shot
        public Bitmap bitmap;
        public CameraImaging()
        {
            // create video source
            VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString );
            // set NewFrame event handler
            videoSource.NewFrame += new NewFrameEventHandler( video_NewFrame );
        }
        public void StartVideo(VideoCaptureDevice videoSource)
        {
            // start the video source
            videoSource.Start();
            // ...
        }
        public void StopVideo(VideoCaptureDevice videoSource)
        {
            // stop the video source
            videoSource.Stop();
            // ...
        }
        private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
        {
            // get new frame
            bitmap = eventArgs.Frame;
            // process the frame
        }
    }
}

同様のコードはこちら: http://www.aforgenet.com/framework/features/directshow_video.html[ ^]

Windows フォームでは、このメソッドを実行するスレッドでこのビデオを実行します。

private void VideoRecording()
    {
        camImg.videoSource.Start();

        while (!StopVideo)
        {
            pictureBox1.Image = camImg.bitmap;
            pictureBox1.Invalidate();
        }
        camImg.videoSource.Stop();

    }
4

3 に答える 3

4

私の記憶が正しければ、ビットマップはイベント後に上書きされるため、すぐにコピーする必要があります。ここで参照を使用するのは良くありません。次のようなものを試してください:

private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
{
    // copy the new frame
    bitmap = new Bitmap(eventArgs.Frame);
    // process the frame
}

また

private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
{
   // clone new frame
   bitmap = eventArgs.Frame.Clone();
   // process the frame
}

また、これには余分なスレッドを使用しないでください。AForge はすでにそれを行っています。

  1. Start の呼び出し (例: load イベント内、またはボタンを押した後)
  2. フレーム イベントを処理する

    private void VideoStream_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
    {
        Bitmap newFrame = new Bitmap(eventArgs.Frame);
        pictureBox1.Image = newFrame;
    }
    
  3. Call Stop (終了イベントまたはボタン)

ラベルなどの WinForm コントロールで問題が発生した場合は、これらのコントロールが別のスレッドで作成されていることを知る必要があり、Invoke を使用する必要があります。例えば:

label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString()));

あなたの最善の策は、フレームワークに付属しているこの AForge サンプルをチェックすることです: http://aforge.googlecode.com/svn/trunk/Samples/Video/Player/

于 2013-06-12T09:32:35.847 に答える
0

1つの方法は、FFMPEGのラッパーを取得または作成することです。これにより、ビデオから画像を抽出する作業を行うことができます。私は、アップロードされたビデオからサムネイルや静止画を取得するこの手段を使用した2つのプロジェクトに取り組んできました。少しハックな感じがしますが、うまくいくはずです。

于 2012-10-22T18:27:59.160 に答える