Уменьшить частоту кадров AVI-файла в AForge - PullRequest
1 голос
/ 18 октября 2011

Я совершенно новичок в области ввода видео и только начал работать с AForge несколько дней назад.Работать с живым видео удобно, но мне нужно что-то сделать с файлами для проекта.

При использовании кодека Windows Media Video 9 VCM сохранение не было проблемой.Выходной файл работает нормально с каждым моим плеером, но моя программа всегда воспроизводит его примерно с удвоенной частотой кадров.Это особенно странно, поскольку нет никаких указаний на то, что частота кадров изменяется: и значение по умолчанию, с которым видео было сохранено, и новый проигрыватель указывают, что частота кадров составляет 25 кадров в секунду.

Единственные предложения, которые я нашелизменить частоту кадров до захвата видео, но это, похоже, ничего не делает.

Оглядываясь в документации 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 Ответ

1 голос
/ 19 октября 2011

Я нашел рабочее решение проблемы, заглянув в некоторые другие области библиотеки. В этом решении было два других класса, которые я пропускал: 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();
    }
}

Спасибо за чтение.

...