AForge转换和HD的问题

时间:2014-08-31 19:32:36

标签: c# video video-capture aforge

首先,我无法播放和录制高清视频(1920x1080),当我将相机分辨率更改为1920x1080程序节目并录制黑色背景时,如果相机分辨率为720x576则无问题。我确定问题出在我的解决方案中,因为当我使用DesktopVideo(Blackmagic Decklink Studio 2附带的软件)时,它会显示来自摄像头的高清视频。 其次,如何使用AForge转换视频?比如改变分辨率和帧速率,我可以改变编解码器和比特率,但是当我在" FileWriter.Open"中更改分辨率和FrameRate时  命令我得到错误解决方案,FrameRate必须与从相机捕获的位图I相同。

如果有人知道如何解决这些问题,请分享信息,谢谢!

这是代码

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Video.FFMPEG;
using AForge.Video.VFW;

namespace WindowsFormsApplication12
{
    public partial class Form1 : Form
    {
        private FilterInfoCollection VideoCaptureDevices;

        private VideoCaptureDevice FinalVideo = null;
        private VideoCaptureDeviceForm captureDevice;
        private Bitmap video;
        //private AVIWriter AVIwriter = new AVIWriter();
        private VideoFileWriter FileWriter = new VideoFileWriter();
        private SaveFileDialog saveAvi;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {


            VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            captureDevice = new VideoCaptureDeviceForm();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            /////capture device list
            if (captureDevice.ShowDialog(this) == DialogResult.OK)
            {

                VideoCaptureDevice videoSource = captureDevice.VideoDevice;
                FinalVideo = captureDevice.VideoDevice;
                FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);
                FinalVideo.Start();
            }
        }
        void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            if (butStop.Text == "Stop Record")
            {
                video = (Bitmap)eventArgs.Frame.Clone();
                pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
                //AVIwriter.Quality = 0;
                FileWriter.WriteVideoFrame(video);
                //AVIwriter.AddFrame(video);
            }
            else
            {
                video = (Bitmap)eventArgs.Frame.Clone();
                pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ////record button
            saveAvi = new SaveFileDialog();
            saveAvi.Filter = "Avi Files (*.avi)|*.avi";
            if (saveAvi.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                int h = captureDevice.VideoDevice.VideoResolution.FrameSize.Height;
                int w = captureDevice.VideoDevice.VideoResolution.FrameSize.Width;
                FileWriter.Open(saveAvi.FileName, w, h,25,VideoCodec.Default,5000000);
                FileWriter.WriteVideoFrame(video);

                //AVIwriter.Open(saveAvi.FileName, w, h);
                butStop.Text = "Stop Record";
                //FinalVideo = captureDevice.VideoDevice;
                //FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);
                //FinalVideo.Start();
            }
        }

        private void butStop_Click(object sender, EventArgs e)
        {
            if (butStop.Text == "Stop Record")
            {
                butStop.Text = "Stop";
                if (FinalVideo == null)
                { return; }
                if (FinalVideo.IsRunning)
                {
                    //this.FinalVideo.Stop();
                    FileWriter.Close();
                    //this.AVIwriter.Close();
                    pictureBox1.Image = null;
                }
            }
            else
            {
                this.FinalVideo.Stop();
                FileWriter.Close();
                //this.AVIwriter.Close();
                pictureBox1.Image = null;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            pictureBox1.Image.Save("IMG" + DateTime.Now.ToString("hhmmss") + ".jpg");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (FinalVideo == null)
            { return; }
            if (FinalVideo.IsRunning)
            {
                this.FinalVideo.Stop();
                FileWriter.Close();
                //this.AVIwriter.Close();
            }
        }


    }
}

1 个答案:

答案 0 :(得分:0)

提供的代码只是捕获并保存当前为捕获设备激活/选择的格式。通常,分辨率变化是“昂贵的”操作,不能作为补充操作。

您希望通过将其切换为更合适的格式来更改捕获设备上的分辨率,然后以此分辨率捕获并以正确的分辨率进行所有进一步的数据操作。可用的分辨率和选项可能是特定于硬件的。

如果/当没有合适的捕获分辨率选项可用时,通常会将视频重新采样为新分辨率。尽管Windows API具有合适的功能,但在您的特定情况下,您有兴趣将其与AForge库集成,并且需要检查其文档以确定它是否提供相应的包装器以及是否可以将其整合到捕获过程中(或者,你需要自己编写这个代码来处理扩展)。