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(); }
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); }