예제 #1
0
        static void TestFFMPEG()
        {
            var videoWriter = new VideoFileWriter();

            int    width        = 800;
            int    height       = 600;
            int    framerate    = 24;
            string path         = Path.GetFullPath("output.webm");
            int    videoBitRate = 1200 * 1000;

            int         audioFrameSize  = 44100;
            int         audioBitRate    = 128000;
            int         audioSampleRate = 44100;
            AudioLayout audioChannels   = AudioLayout.Mono;


            videoWriter.Width       = width;
            videoWriter.Height      = height;
            videoWriter.FrameRate   = framerate;
            videoWriter.VideoCodec  = VideoCodec.Vp8;
            videoWriter.BitRate     = videoBitRate;
            videoWriter.PixelFormat = AVPixelFormat.FormatYuv420P;
            videoWriter.Open(path);

            //, audioFrameSize, audioChannels, audioSampleRate, AudioCodec.Vorbis, audioBitRate);

            var a = new Accord.DirectSound.AudioDeviceCollection(DirectSound.AudioDeviceCategory.Capture);

            // Generate 1 second of audio
            SineGenerator gen = new SineGenerator()
            {
                SamplingRate = audioSampleRate,
                Channels     = 1,
                Format       = SampleFormat.Format16Bit,
                Frequency    = 10,
                Amplitude    = 1000.9f,
            };

            Signal s = gen.Generate(TimeSpan.FromSeconds(255));
            //s.Save("test.wav");

            var    m2i = new MatrixToImage();
            Bitmap frame;

            for (byte i = 0; i < 255; i++)
            {
                byte[,] matrix = Matrix.Create(height, width, i);
                m2i.Convert(matrix, out frame);
                videoWriter.WriteVideoFrame(frame, TimeSpan.FromSeconds(1));

                //// Generate 1 second of audio
                //s = gen.Generate(TimeSpan.FromSeconds(1));
                //videoWriter.WriteAudioFrame(s);
            }

            videoWriter.Close();
        }
예제 #2
0
        private void Form1_Load(object sender, System.EventArgs e)
        {
            // **************************************************
            IsRecording = false;
            // **************************************************

            // **************************************************
            //System.Drawing.Rectangle captureRegion =
            //	System.Windows.Forms.Screen.PrimaryScreen.Bounds;

            System.Drawing.Rectangle captureRegion =
                System.Windows.Forms.Screen.AllScreens
                .ToList()[0]
                .Bounds;

            //CaptureRegionWidth = captureRegion.Width;
            //CaptureRegionHeight = captureRegion.Height;

            CaptureRegionWidth  = (int)(captureRegion.Width * 1.5);
            CaptureRegionHeight = (int)(captureRegion.Height * 1.5);
            // **************************************************

            // https://support.video.ibm.com/hc/en-us/articles/207852117-Internet-connection-and-recommended-encoding-settings

            // **************************************************
            // 24, 30
            int videoFrameRate = 25;

            // 1200 - 4000 KbPS
            //  1200 * 1024
            //int videoBitRate = CaptureRegionWidth * CaptureRegionHeight;
            //int videoBitRate = 200 * 1000;
            int videoBitRate = 1200 * 1000;

            int videoKeyFrameInterval =
                System.Convert.ToInt32(1000 / (double)videoFrameRate);

            int videoFrameSize =
                CaptureRegionWidth * CaptureRegionHeight;

            Accord.Math.Rational videoFrameRateRational =
                new Accord.Math.Rational
                    (numerator: 1000, denominator: videoKeyFrameInterval);
            // **************************************************

            // **************************************************
            timerRecording.Interval = videoKeyFrameInterval;
            // **************************************************

            // **************************************************
            int audioSampleRate = 44100;

            // 320 * 1000
            // 320 * 1024
            // 128 * 1024
            int audioBitRate = 128 * 1000;

            int audioFrameSize = 10 * 4096;
            // **************************************************

            // **************************************************
            string pathName =
                $"D:\\_TEMP\\MOVIE_{ System.DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") }.avi";

            // **************************************************

            // **************************************************
            VideoFileWriter =
                new Accord.Video.FFMPEG.VideoFileWriter
            {
                Width  = CaptureRegionWidth,
                Height = CaptureRegionHeight,

                FrameRate = videoFrameRateRational,
                BitRate   = videoBitRate,

                VideoCodec = Accord.Video.FFMPEG.VideoCodec.H264,
            };

            // visually Lossless
            VideoFileWriter.VideoOptions["crf"]      = "18";
            VideoFileWriter.VideoOptions["preset"]   = "veryfast";
            VideoFileWriter.VideoOptions["tune"]     = "zerolatency";
            VideoFileWriter.VideoOptions["x264opts"] = "no-mbtree:sliced-threads:sync-lookahead=0";
            // **************************************************

            // **************************************************
            System.Guid?audioDeviceGuid = null;

            Accord.DirectSound.AudioDeviceCollection audioDeviceCollection =
                new Accord.DirectSound.AudioDeviceCollection(Accord.DirectSound.AudioDeviceCategory.Capture);

            foreach (Accord.DirectSound.AudioDeviceInfo audioDeviceInfo in audioDeviceCollection)
            {
                audioDeviceGuid = audioDeviceInfo.Guid;

                //System.Windows.Forms.MessageBox.Show
                //	($"Guid: { audioDeviceInfo.Guid } - Description: { audioDeviceInfo.Description }");
            }
            // **************************************************

            // **************************************************
            if (audioDeviceGuid.HasValue)
            {
                AudioCaptureDevice =
                    new Accord.DirectSound.AudioCaptureDevice(device: audioDeviceGuid.Value)
                {
                    SampleRate       = audioSampleRate,
                    DesiredFrameSize = audioFrameSize,
                    Format           = Accord.Audio.SampleFormat.Format32BitIeeeFloat,
                };

                AudioCaptureDevice.AudioSourceError += AudioCaptureDevice_AudioSourceError;
            }
            // **************************************************

            // **************************************************
            var audioCaptureDevices =
                new System.Collections.Generic.List <Accord.DirectSound.AudioCaptureDevice>();

            if (AudioCaptureDevice != null)
            {
                audioCaptureDevices.Add(AudioCaptureDevice);
            }
            // **************************************************

            // **************************************************
            if (audioCaptureDevices.Count > 0)
            {
                AudioSourceMixer =
                    new Accord.Audio.AudioSourceMixer(sources: audioCaptureDevices);

                AudioSourceMixer.NewFrame         += AudioSourceMixer_NewFrame;
                AudioSourceMixer.AudioSourceError += AudioSourceMixer_AudioSourceError;

                VideoFileWriter.FrameSize    = audioFrameSize;
                VideoFileWriter.AudioBitRate = audioBitRate;
                VideoFileWriter.SampleRate   = audioSampleRate;
                VideoFileWriter.AudioCodec   = Accord.Video.FFMPEG.AudioCodec.Aac;

                VideoFileWriter.AudioLayout =
                    AudioSourceMixer.NumberOfChannels == 1 ?
                    Accord.Video.FFMPEG.AudioLayout.Mono :
                    Accord.Video.FFMPEG.AudioLayout.Stereo;
            }
            // **************************************************

            VideoFileWriter.Open(fileName: pathName);
        }