2011-10-18 179 views
1

我對視頻輸入是全新的,並且剛剛在幾天前開始與AForge合作。使用實時視頻很舒服,但我現在需要爲項目的文件做些事情。降低AForge中AVI文件的幀率

使用Windows Media Video 9 VCM編解碼器,保存不成問題。輸出文件對所有玩家都正常工作,但我的程序總是以大約兩倍的幀速率播放它。這是特別奇怪的,因爲從來沒有任何跡象表明幀率發生了變化:視頻保存的默認值和新播放器都表明幀速率爲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。具體來說,我需要使用FileVideoSource和VideoSourcePlayer的實例將視頻轉換爲我可以使用的內容。

這個版本與上面的不同之處在於讀寫功能都被合併到一個程序中。此外,我很急於完成這項工作,所以它仍然非常脆弱。儘管如此,這裏是我的解決方案:

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

謝謝你的閱讀。