2011-10-18 98 views
1

私はビデオ入力を全く新しくして、数日前にAForgeで作業を始めました。ライブビデオの操作は快適ですが、私はプロジェクトのためにファイルを使って何かをする必要があります。AForgeのAVIファイルのフレームレートを減らす

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(); 

    } 
} 

その他のご意見をいただければ幸いです。あなたの時間をありがとう。

答えて

1

私は、ライブラリの他のいくつかの領域を調べることで、問題の解決方法を見つけました。このソリューションでは、既に参照されているDirectShowとControlの2つのクラスがあります。具体的には、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(); 
    } 
} 

ありがとうございます。

関連する問題