C# 降低图像中AVI文件的帧速率

C# 降低图像中AVI文件的帧速率,c#,image-processing,frame-rate,aforge,C#,Image Processing,Frame Rate,Aforge,我对视频输入完全不熟悉,几天前才开始与阿福奇合作。使用实时视频很舒服,但我现在需要为项目的文件做一些事情 使用Windows Media Video 9 VCM编解码器,保存不是问题。输出文件对我所有的播放器都正常工作,但我的程序总是以大约两倍的帧速率播放。这尤其奇怪,因为从来没有任何迹象表明帧速率发生了变化:视频保存时使用的默认值和新播放器都表明帧速率为25 fps 我发现唯一的建议是在视频被捕获之前改变帧速率,但这似乎没有任何作用 在AVIFileVideoSource文档中,我找到了Fra

我对视频输入完全不熟悉,几天前才开始与阿福奇合作。使用实时视频很舒服,但我现在需要为项目的文件做一些事情

使用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:表单
{
AVIReader输入=新的AVIReader();
AVIFileVideoSource=新的AVIFileVideoSource(“test.avi”);
公共表格1()
{
初始化组件();
}
public void cam_NewFrame(对象发送方,NewFrameEventArgs eventArgs)
{
input.Open(“test.avi”);
for(int i=0;i

如有任何其他建议,将不胜感激。谢谢您的时间。

我通过查看图书馆的其他部分找到了解决问题的有效方法。在这个解决方案中,我忽略了另外两个类:已经被引用的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();
    }
}

感谢您的阅读。

我通过查看图书馆的其他部分找到了解决问题的有效方法。在这个解决方案中,我忽略了另外两个类:已经被引用的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();
    }
}
谢谢你的阅读