C # рекордер экрана уменьшить размер видео файла AVI - PullRequest
0 голосов
/ 28 ноября 2018

Я сейчас пытаюсь сделать экранный рекордер на C #, и пока он работает, но проблема в том, что что-то такое простое, как 20-секундное видео, займет около 1 ГБ пространства.Я настроил его так, что таймер непрерывно делает снимки экрана с помощью этого метода:

void takeScreenshot()
        {
            Rectangle bounds = Screen.FromControl(this).Bounds;
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    //Add screen to bitmap:
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
                //Create and save screenshot:
                string name = path + "//screenshot-" + fileCount + ".jpeg";
                bitmap.Save(name, ImageFormat.Jpeg);
                inputImageSequence.Add(name);
                fileCount++;

                //Dispose of bitmap:
                bitmap.Dispose();
            }
        }

И затем он сохраняет эти изображения во временной папке на диске D: //, а затем, когда все готово, он берет всеснимайте и создавайте видео AVI из них следующим образом:

//Set bounds of video to screen size:
            Rectangle bounds = Screen.FromControl(this).Bounds;
            int width = bounds.Width;
            int height = bounds.Height;

            var framRate = 5;

            using (var vFWriter = new VideoFileWriter())
            {
                //Create new video file:
                vFWriter.Open(outputPath+"//video.avi", width, height, framRate, VideoCodec.Raw);

                //Make each screenshot into a video frame:
                foreach (var imageLocation in inputImageSequence)
                {
                    Bitmap imageFrame = System.Drawing.Image.FromFile(imageLocation) as Bitmap;
                    vFWriter.WriteVideoFrame(imageFrame);
                    imageFrame.Dispose();
                }
                vFWriter.Close();
            }
            //Delete the screenshots and temporary folder:
            DeletePath(path);

Любая помощь по снижению неэффективности этого приветствуется, я довольно новичок в этом виде программирования.

...