C# Bitmap для AVI / WMV с компрессией

Прелюдия:

Я собираюсь предвосхитить это, я изучал C# в свободное время на работе, и что я целыми днями смотрел на код, пытаясь обдумать эту проблему. Я разрабатываю некоторое программное обеспечение, которое будет использоваться с визуализатором, который подключается через USB к стандартному настольному ПК, программное обеспечение обнаруживает устройство захвата и загружает кадры в растровое изображение с помощью события New Frame, затем оно отображается в "графическом окне" в виде видео в прямом эфире. Проблема заключается в том, чтобы попытаться включить возможность записи потока и сохранения в файл, предпочтительно WMV или сжатый AVI.

Что было опробовано:

Я рассмотрел и изучил следующее:

SharpAVI - кажется, нельзя заставить это правильно сжимать или сохранять кадры, так как в основном он смотрит на существующие файлы AVI.

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

AForge.Video.FFMPEG - Опять же, из-за соображений тех, кто использует это программное обеспечение, у меня не может быть неуправляемых библиотек DLL в выходной папке с исполняемым файлом, и, к сожалению, эта конкретная библиотека DLL не может быть правильно скомпилирована с помощью Costura Fody.

Оболочка библиотеки AVIFile (из проекта кода) - опять- таки не получается заставить это правильно сжимать поток из растровых изображений из событий нового кадра.

DirectShow - похоже, использует C++ и, к сожалению, в настоящее время находится за пределами моего уровня квалификации.

Соответствующие фрагменты кода:

Текущие ссылки:

using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Resources;
using System.Drawing.Imaging;
using System.IO;
//Aforge Video DLL's
using AForge.Video;
using AForge.Video.VFW;
using AForge.Video.DirectShow;
//Aforge Image DLL's
using AForge.Imaging;
using AForge.Imaging.Formats;
using AForge.Imaging.Filters;
//AviLibrary
using AviFile;

Глобальные переменные:

    #region Global Variables

    private FilterInfoCollection CaptureDevice; // list of available devices
    private VideoCaptureDevice videoSource;
    public System.Drawing.Image CapturedImage;

    bool toggleMic = false;

    bool toggleRec = false;
    //aforge
    AVIWriter aviWriter;
    Bitmap image;


    #endregion

Код для отображения потока

    #region Displays the Stream

    void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        picBoxStream.SizeMode = PictureBoxSizeMode.Zoom;
        picBoxStream.Image = (Bitmap)eventArgs.Frame.Clone();// clones the bitmap


        if (toggleRec == true)
        {
            image = (Bitmap)eventArgs.Frame.Clone();
            aviWriter.AddFrame(image);
        }
    }

    #endregion

Текущий код для записи потока

    #region Record Button

    private void btnRecord_Click(object sender, EventArgs e)
    {
        if (toggleRec == false)
        {
            saveAVI = new SaveFileDialog();
            saveAVI.Filter = "AVI Files (*.avi)|*.avi";

            if (saveAVI.ShowDialog() == DialogResult.OK)
            {
                aviWriter = new AVIWriter();
                aviWriter.Open(saveAVI.FileName, 1280, 720);

                toggleRec = true;
                Label lblRec = new Label();
            }

        }
        else if (toggleRec == true)
        {
            aviWriter.Close();
            toggleRec = false;
        }
    }

    #endregion

Я прошу прощения, если приведенный выше код выглядит не совсем правильно, я менял местами, менял и перекодировал эти три раздела, чтобы найти рабочую комбинацию. Это означает, что это довольно неопрятно, но я не видел смысла все это очищать, пока у меня не заработал код. Это говорит о том, что любая помощь, которую вы можете оказать, будет с большим удовольствием получена, даже если это то, что я хочу сделать, просто невозможно.

Заранее спасибо.

РЕДАКТИРОВАТЬ: PostScript:

Я буду активно работать с понедельника по пятницу, поэтому, если я сделаю какие-то прорывы, я буду соответствующим образом обновлять этот Вопрос, это, кажется, часто сортируется после ответа, так что, надеюсь, мы сможем преодолеть проблемы.

2 ответа

Та же проблема, что я только что решил:) вот мой код, как использовать библиотеку AviFile для создания файла avi:)

    private void MakeAvi(List<Bitmap> maps)
    {
        AviManager mana = new AviManager("local.avi", false);

        //false means do not show the diag of the Compression 
        //21 means the fps of the video
        //maplist[0] cover of the video  the maplist is the val you should insert 
        VideoStream avistream = mana.AddVideoStream(false, 21, maplist[0]);

        for (int i = 1; i < maps.Count; i++)
        {
            avistream.AddFrame(maplist[i]);
        }

        mana.Close();
        MessageBox.Show("AddOk");
    }
namespace ip_androidcam
{
    public partial class Form1 : Form
    {   
        MJPEGStream stream;
        AVIWriter writer;
        bool toggleRec = false;
        public Form1()
        {
            InitializeComponent() ;

        }

        void stream_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap bmp = (Bitmap)eventArgs.Frame.Clone();
            bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
            pictureBox1.Image = bmp;

            try
            {
                if (toggleRec == true)
                {
                    bmp = (Bitmap)eventArgs.Frame.Clone();
                    bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
                    writer.AddFrame(bmp);
                }
            }
            catch (Exception e)
            {
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                stream = new MJPEGStream(textBox1.Text);
                stream.NewFrame +=stream_NewFrame;
                stream.Start();
            }
            catch
            {
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (stream.IsRunning == true)
                {
                    stream.Stop();
                }
            }
            catch
            { 
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                pictureBox1.Image = (Bitmap)pictureBox1.Image.Clone();
                pictureBox1.Image.Save("D:\\Pictures\\pix-" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm-ss" + ".jpeg" + ImageFormat.Jpeg));
            }
            catch (Exception)
            {
                MessageBox.Show("Capture Image First");
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.ImageLocation = ofd.FileName;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (toggleRec == false)
            {
                SaveFileDialog saveAVI = new SaveFileDialog();
                saveAVI.Filter = "AVI Files (*.avi)|*.avi";

                if (saveAVI.ShowDialog() == DialogResult.OK)
                {
                     writer = new AVIWriter("XVID");
                     writer.Open(saveAVI.FileName , 480, 640);
                     toggleRec = true;
                     Label lblRec =new Label();
                }
            }


        }

        private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                writer.Close();
                MessageBox.Show("video recorded successfully");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

    }
}
Другие вопросы по тегам