1

私はビデオ入力に関してまったくの初心者で、数日前に AForge を使い始めたばかりです。ライブ ビデオの操作は快適ですが、プロジェクト用のファイルを操作する必要があります。

Windows Media Video 9 VCM コーデックを使用すると、保存に問題はありません。出力ファイルは、私が持っているすべてのプレーヤーで正常に機能しますが、私のプログラムは常に約 2 倍のフレーム レートで再生します。フレーム レートが変更されたことを示す兆候がないため、これは特に奇妙です。ビデオが保存されたデフォルトと新しいプレーヤーの両方が、フレーム レートが 25 fps であることを示しています。

私が見つけた唯一の提案は、ビデオをキャプチャする前にフレーム レートを変更することですが、これは何もしないようです。

AVIFileVideoSource のドキュメントを調べたところ、FrameIntervalFromSource および FrameInterval プロパティが見つかりました。これらを組み合わせることで、探している結果が得られるはずですが、それらを機能させることもできません。他のすべては行き止まりであり、私はアイデアがありません。ファイルを読み取るために使用しているコードは次のとおりです。

    public partial class Form1 : Form
{
    AVIReader input = new AVIReader();
    AVIFileVideoSource source = new AVIFileVideoSource("test.avi");

    public Form1()
    {
        InitializeComponent();
    }

    public void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        input.Open("test.avi");
        for (int i = 0; i < input.Length; i++)
        {
            pictureBox1.Image = input.GetNextFrame();
        }
        source.Stop();
        input.Close();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        source.NewFrame += new NewFrameEventHandler(cam_NewFrame);
        source.Start();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        source.Stop();
        input.Close();

    }
}

他の提案は大歓迎です。お時間をいただきありがとうございます。

4

1 に答える 1

1

ライブラリの他の領域を調べて、問題の有効な解決策を見つけました。このソリューションでは、見落としていた他の 2 つのクラスがありました。既に参照されている DirectShow と Control です。具体的には、FileVideoSource と VideoSourcePlayer のインスタンスを使用して、ビデオを操作できるものにする必要がありました。

このバージョンは、読み取り機能と書き込み機能の両方が 1 つのプログラムに結合されているという点で、上記とは異なります。さらに、私はこれを成し遂げるために急いでいたので、まだかなり壊れやすい. それにもかかわらず、ここに私の解決策があります:

    public partial class Form1 : Form
{
    public Bitmap newBitmap;
    public VideoCaptureDevice cam = null;
    public FilterInfoCollection usbCams;

    AVIReader reader = new AVIReader();
    AVIWriter writer = new AVIWriter("wmv3");
    AVIFileVideoSource source = new AVIFileVideoSource("test.avi");

    FileVideoSource normSource = new FileVideoSource("test.avi");
    VideoSourcePlayer player = new VideoSourcePlayer();

    public Form1()
    {
        InitializeComponent();
    }

    public void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Bitmap image = (Bitmap)eventArgs.Frame.Clone();
        writer.AddFrame(image);

        pictureBox1.Image = image;
    }

    public void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        newBitmap = (Bitmap)eventArgs.Frame.Clone();
        pictureBox1.Image = newBitmap;
    }

    private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
    {
        videoSourcePlayer1.VideoSource = normSource;
        videoSourcePlayer1.GetCurrentVideoFrame();

        videoSourcePlayer1.DrawToBitmap(newBitmap,
            new Rectangle(0, 0, image.Width, image.Height));
    }

    private void button1_Click(object sender, EventArgs e)
    {
        source.NewFrame += new NewFrameEventHandler(video_NewFrame);
        source.Start();
        videoSourcePlayer1.NewFrame += new AForge.Controls.VideoSourcePlayer.NewFrameHandler(videoSourcePlayer_NewFrame);
        videoSourcePlayer1.Start();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (source.IsRunning == true)
        {
            source.Stop();
            videoSourcePlayer1.Stop();
        }

        if (cam != null)
        {
            cam.Stop();
            writer.Close();
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        usbCams = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        cam = new VideoCaptureDevice(usbCams[0].MonikerString);
        cam.DesiredFrameSize = new Size(320, 240);

        writer.Open("test.avi", 320, 240);

        cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
        cam.DesiredFrameRate = 25;
        cam.Start();
    }
}

読んでくれてありがとう。

于 2011-10-19T01:46:00.233 に答える