Esempio n. 1
0
        void CreateVideoStream(int Width, int Height)
        {
            // Select encoder type based on FOURCC of codec
            if (_codec == AviCodec.Uncompressed)
            {
                _videoStream = _writer.AddUncompressedVideoStream(Width, Height);
            }
            else if (_codec == AviCodec.MotionJpeg)
            {
                _videoStream = _writer.AddMotionJpegVideoStream(Width, Height, _codec.Quality);
            }
            else
            {
                _videoStream = _writer.AddMpeg4VideoStream(Width, Height,
                                                           (double)_writer.FramesPerSecond,
                                                           // It seems that all tested MPEG-4 VfW codecs ignore the quality affecting parameters passed through VfW API
                                                           // They only respect the settings from their own configuration dialogs, and Mpeg4VideoEncoder currently has no support for this
                                                           0,
                                                           _codec.Quality,
                                                           // Most of VfW codecs expect single-threaded use, so we wrap this encoder to special wrapper
                                                           // Thus all calls to the encoder (including its instantiation) will be invoked on a single thread although encoding (and writing) is performed asynchronously
                                                           _codec.FourCC,
                                                           true);
            }

            _videoStream.Name = "ScrenaVideo";
        }
Esempio n. 2
0
        public Recorder(RecorderParams Params, string NameOfTheStream)
        {
            try
            {
                this.Params = Params;

                // Create AVI writer and specify FPS
                writer = Params.CreateAviWriter();

                // Create video stream
                videoStream = Params.CreateVideoStream(writer);
                // Set only name. Other properties were when creating stream,
                // either explicitly by arguments or implicitly by the encoder used
                videoStream.Name = NameOfTheStream;

                screenThread = new Thread(RecordScreen)
                {
                    Name         = typeof(Recorder).Name + ".RecordScreen",
                    IsBackground = true
                };

                screenThread.Start();
            }
            catch (Exception exp)
            {
                throw exp;
            }
        }
 private void ConfigureStream(IAviVideoStream stream)
 {
     stream.Width = Screen.PrimaryScreen.WorkingArea.Width;
     stream.Height = Screen.PrimaryScreen.WorkingArea.Height;
     stream.Codec = KnownFourCCs.Codecs.Uncompressed;
     stream.BitsPerPixel = BitsPerPixel.Bpp32;
 }
Esempio n. 4
0
        /// <summary>
        /// Records this instance.
        /// </summary>
        /// <exception cref="RedCell.Research.ResearchException">
        /// Filename must be set before recording.
        /// or
        /// A recording has already started.
        /// </exception>
        /// <exception cref="System.InvalidOperationException">Filename must be set before recording.</exception>
        public void StartRecord()
        {
            // Automatic filename
            if (string.IsNullOrWhiteSpace(Filename))
            {
                Filename = "Video_" + DateTime.Now.ToString("yyyyMMddHHmmss");
            }

            if (_writer != null)
            {
                throw new ResearchException("A recording has already started.");
            }

            // Get video details from camera.
            if (StreamSetting == null)
            {
                StreamSetting = Camera.StreamSetting;
            }

            var encoder = new Mpeg4VideoEncoderVcm(StreamSetting.Width, StreamSetting.Height, StreamSetting.Framerate, 0, 50, KnownFourCCs.Codecs.X264);

            _writer = new AviWriter(Filename);
            _video  = _writer.AddEncodingVideoStream(encoder, true, StreamSetting.Width, StreamSetting.Height);


            Camera.FrameAvailable += Camera_FrameAvailable;
        }
Esempio n. 5
0
        public Recorder(string fileName, 
            FourCC codec, int quality, 
            int audioSourceIndex, SupportedWaveFormat audioWaveFormat, bool encodeAudio, int audioBitRate)
        {
            System.Windows.Media.Matrix toDevice;
            using (var source = new HwndSource(new HwndSourceParameters()))
            {
                toDevice = source.CompositionTarget.TransformToDevice;
            }

            screenWidth = (int)Math.Round(SystemParameters.PrimaryScreenWidth * toDevice.M11);
            screenHeight = (int)Math.Round(SystemParameters.PrimaryScreenHeight * toDevice.M22);

            // Create AVI writer and specify FPS
            writer = new AviWriter(fileName)
            {
                FramesPerSecond = 10,
                EmitIndex1 = true,
            };

            // Create video stream
            videoStream = CreateVideoStream(codec, quality);
            // Set only name. Other properties were when creating stream,
            // either explicitly by arguments or implicitly by the encoder used
            videoStream.Name = "Screencast";

            if (audioSourceIndex >= 0)
            {
                var waveFormat = ToWaveFormat(audioWaveFormat);

                audioStream = CreateAudioStream(waveFormat, encodeAudio, audioBitRate);
                // Set only name. Other properties were when creating stream,
                // either explicitly by arguments or implicitly by the encoder used
                audioStream.Name = "Voice";

                audioSource = new WaveInEvent
                {
                    DeviceNumber = audioSourceIndex,
                    WaveFormat = waveFormat,
                    // Buffer size to store duration of 1 frame
                    BufferMilliseconds = (int)Math.Ceiling(1000 / writer.FramesPerSecond),
                    NumberOfBuffers = 3,
                };
                audioSource.DataAvailable += audioSource_DataAvailable;
            }

            screenThread = new Thread(RecordScreen)
            {
                Name = typeof(Recorder).Name + ".RecordScreen",
                IsBackground = true
            };

            if (audioSource != null)
            {
                videoFrameWritten.Set();
                audioBlockWritten.Reset();
                audioSource.StartRecording();
            }
            screenThread.Start();
        }
Esempio n. 6
0
        /// <summary>
        /// 录制屏幕
        /// </summary>
        /// <param name="fileName">要保存的文件名</param>
        /// <param name="codec">编码</param>
        /// <param name="quality">录制质量</param>
        /// <param name="zoom">缩放</param>
        public Recorder(string fileName, FourCC codec, int quality = 70, float zoom = 1.0F)
        {
            //设置缩放 宽高
            zoomHeight = (int)Math.Floor(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height * zoom);
            zoomWidth  = (int)Math.Floor(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width * zoom);

            this.zoom = zoom;
            //创建视频
            writer = new AviWriter(fileName)
            {
                FramesPerSecond = 10,
                EmitIndex1      = true,
            };

            //创建视频流
            videoStream      = CreateVideoStream(codec, quality);
            videoStream.Name = "Screencast";
            //开启一个线程录制屏幕
            screenThread = new Thread(RecordScreen)
            {
                Name         = typeof(Recorder).Name + ".RecordScreen",
                IsBackground = true
            };

            //钩子函数用于监控是否点击了鼠标
            // hook = WinHook.SetWindowsHookEx(HookType.WH_MOUSE_LL, WinHook.hookProc += MouseHook, Win32Api.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);

            screenThread.Start();
        }
Esempio n. 7
0
        public Recorder(string fileName,
                        FourCC codec, int quality,
                        int audioSourceIndex, SupportedWaveFormat audioWaveFormat, bool encodeAudio, int audioBitRate)
        {
            System.Windows.Media.Matrix toDevice;
            using (var source = new HwndSource(new HwndSourceParameters()))
            {
                toDevice = source.CompositionTarget.TransformToDevice;
            }

            screenWidth  = (int)Math.Round(SystemParameters.PrimaryScreenWidth * toDevice.M11);
            screenHeight = (int)Math.Round(SystemParameters.PrimaryScreenHeight * toDevice.M22);

            // Create AVI writer and specify FPS
            writer = new AviWriter(fileName)
            {
                FramesPerSecond = 10,
                EmitIndex1      = true,
            };

            // Create video stream
            videoStream = CreateVideoStream(codec, quality);
            // Set only name. Other properties were when creating stream,
            // either explicitly by arguments or implicitly by the encoder used
            videoStream.Name = "Screencast";

            if (audioSourceIndex >= 0)
            {
                var waveFormat = ToWaveFormat(audioWaveFormat);

                audioStream = CreateAudioStream(waveFormat, encodeAudio, audioBitRate);
                // Set only name. Other properties were when creating stream,
                // either explicitly by arguments or implicitly by the encoder used
                audioStream.Name = "Voice";

                audioSource = new WaveInEvent
                {
                    DeviceNumber = audioSourceIndex,
                    WaveFormat   = waveFormat,
                    // Buffer size to store duration of 1 frame
                    BufferMilliseconds = (int)Math.Ceiling(1000 / writer.FramesPerSecond),
                    NumberOfBuffers    = 3,
                };
                audioSource.DataAvailable += audioSource_DataAvailable;
            }

            screenThread = new Thread(RecordScreen)
            {
                Name         = typeof(Recorder).Name + ".RecordScreen",
                IsBackground = true
            };

            if (audioSource != null)
            {
                videoFrameWritten.Set();
                audioBlockWritten.Reset();
                audioSource.StartRecording();
            }
            screenThread.Start();
        }
Esempio n. 8
0
        public void StartRecord(string fileName, FourCC codec, int quality)
        {
            stopThread = new ManualResetEvent(false);

            // Create AVI writer and specify FPS
            writer = new AviWriter(fileName)
            {
                FramesPerSecond = 10,
                EmitIndex1      = true,
            };

            // Create video stream
            videoStream = CreateVideoStream(codec, quality);
            // Set only name. Other properties were when creating stream,
            // either explicitly by arguments or implicitly by the encoder used
            videoStream.Name = "Screencast";

            screenThread = new Thread(RecordScreen)
            {
                Name         = typeof(RecorderVideo).Name + ".RecordScreen",
                IsBackground = true
            };
            screenThread.Start();
            stopwatchGlobal = Stopwatch.StartNew();
        }
 public TimedFrameWriter(IAviVideoStream videoStream, AviWriter writer, RecorderParams @params)
 {
     VideoStream = videoStream;
     Writer      = writer;
     Params      = @params;
     msPerFrame  = (1.0 / (double)writer.FramesPerSecond) * 1000;
 }
Esempio n. 10
0
        private void CreateVideoStream(int width, int height)
        {
            // Select encoder type based on FOURCC of codec
            if (_codec == AviCodec.Uncompressed)
            {
                _videoStream = _writer.AddUncompressedVideoStream(width, height);
            }
            else if (_codec == AviCodec.MotionJpeg)
            {
                // MotionJpegVideoStream implementation allocates multiple WriteableBitmap for every thread
                // Use SingleThreadWrapper to reduce allocation
                var encoderFactory = new Func <IVideoEncoder>(() => new MotionJpegVideoEncoderWpf(width, height, _codec.Quality));
                var encoder        = new SingleThreadedVideoEncoderWrapper(encoderFactory);

                _videoStream = _writer.AddEncodingVideoStream(encoder, true, width, height);
            }
            else
            {
                _videoStream = _writer.AddMpeg4VideoStream(width, height,
                                                           (double)_writer.FramesPerSecond,
                                                           // It seems that all tested MPEG-4 VfW codecs ignore the quality affecting parameters passed through VfW API
                                                           // They only respect the settings from their own configuration dialogs, and Mpeg4VideoEncoder currently has no support for this
                                                           0,
                                                           _codec.Quality,
                                                           // Most of VfW codecs expect single-threaded use, so we wrap this encoder to special wrapper
                                                           // Thus all calls to the encoder (including its instantiation) will be invoked on a single thread although encoding (and writing) is performed asynchronously
                                                           _codec.FourCC,
                                                           true);
            }

            _videoStream.Name = "Video";
        }
        private void StartRecordingThread(string videoFileName, ISeleniumTest scenario, int fps)
        {
            fileName = videoFileName;

            using (writer = new AviWriter(videoFileName)
            {
                FramesPerSecond = fps,
                EmitIndex1 = true
            })
            {
                stream = writer.AddVideoStream();
                this.ConfigureStream(stream);

                while (!scenario.IsFinished || forceStop)
                {
                    GetScreenshot(buffer);

                    //Thread safety issues
                    lock (locker)
                    {
                        stream.WriteFrame(true, buffer, 0, buffer.Length);
                    }

                }
            }

        }
Esempio n. 12
0
        /// <summary>
        /// 初始化Avi文件
        /// </summary>
        /// <param name="filePath">Avi文件路径</param>
        public void InitRecord(String filePath)
        {
            try
            {
                if (_writer == null)
                {
                    //在文件路径下创建AVI文件
                    _writer = new AviWriter(filePath)
                    {
                        FramesPerSecond = 30,
                        // Emitting AVI v1 index in addition to OpenDML index (AVI v2)
                        // improves compatibility with some software, including
                        // standard Windows programs like Media Player and File Explorer
                        EmitIndex1 = true
                    };
                    //确定编码格式
                    _stream = _writer.AddMpeg4VideoStream(1920, 1080, 30,
                                                          quality: 70, codec: KnownFourCCs.Codecs.X264, forceSingleThreadedAccess: true);
                }

                //创建AVI文件完成,判断标记赋值
                IsCreateRecord = false;
            }
            catch
            {
                Stoping();
                //System.Windows.MessageBox.Show(ex.Message);
                //Console.WriteLine(ex.Message);
            }
        }
Esempio n. 13
0
        private void CreateVideoStream(int width, int height)
        {
            var quality      = 70;
            var screenWidth  = width;
            var screenHeight = height;

            _videoStream      = _writer.AddMotionJpegVideoStream(screenWidth, screenHeight, quality);
            _videoStream.Name = "Epidemic Simulator";
        }
Esempio n. 14
0
        public void Init()
        {
            _writer = new AviWriter(VideoPath)
            {
                FramesPerSecond = 30,
                EmitIndex1      = true
            };

            try {
                _stream = _writer.AddUncompressedVideoStream(DmdWidth, DmdHeight);
                Logger.Info("Uncompressed encoder found.");
            } catch (InvalidOperationException e) {
                Logger.Warn("Error creating Uncompressed encoded stream: {0}.", e.Message);
            }

            try {
                if (_stream == null)
                {
                    _stream = _writer.AddMpeg4VideoStream(
                        DmdWidth, DmdHeight, Fps,
                        quality: 100,
                        codec: KnownFourCCs.Codecs.X264,
                        forceSingleThreadedAccess: true
                        );
                    Logger.Info("X264 encoder found.");
                }
            } catch (InvalidOperationException e) {
                Logger.Warn("Error creating X264 encoded stream: {0}.", e.Message);
            }

            try {
                if (_stream == null)
                {
                    _stream = _writer.AddMotionJpegVideoStream(DmdWidth, DmdHeight,
                                                               quality: 100
                                                               );
                }
                Logger.Info("MJPEG encoder found.");
            } catch (InvalidOperationException e) {
                Logger.Warn("Error creating MJPEG encoded stream: {0}.", e.Message);
            }

            if (_stream == null)
            {
                Logger.Error("No encoder available, aborting.");
                return;
            }
            _animation = Observable
                         .Interval(TimeSpan.FromTicks(1000 * TimeSpan.TicksPerMillisecond / Fps))
                         .Subscribe(_ => {
                if (_frame != null)
                {
                    _stream?.WriteFrame(true, _frame, 0, _frame.Length);
                }
            });
            Logger.Info("Writing video to {0}.", VideoPath);
        }
        public void Stoping()
        {
            writer.Close();
            writer = null;
            stream = null;

            IsCreateRecord = false;
            IsRecording    = false;
        }
        /// <summary>
        /// Render a video based on JPEG-images
        /// </summary>
        /// <param name="fps">Requested frames-per-second</param>
        /// <param name="width">Width of the images</param>
        /// <param name="height">Height of the images</param>
        /// <param name="quality">Requested quality</param>
        /// <param name="path">Path to the folder containing frame-images</param>
        /// <param name="renderGuid">Unique GUID for this frame-batch</param>
        /// <returns>Path to the video</returns>
        public static async Task <string> RenderVideoAsync(int fps, int width, int height, int quality, string path, string renderGuid)
        {
            if (quality < 1 && quality > 100)
            {
                throw new ArgumentException("Quality can only be between 1 and 100.");
            }

            Task <string> renderT = Task.Run(() =>
            {
                // Compose output path
                string outputPath = string.Format("{0}/{1}.avi", path, renderGuid);

                // Create a new writer with the requested FPS
                AviWriter writer = new AviWriter(outputPath)
                {
                    FramesPerSecond = fps
                };

                // Create a new stream to process it
                IAviVideoStream stream = writer.AddEncodingVideoStream(new MotionJpegVideoEncoderWpf(width, height, quality));
                stream.Width           = width;
                stream.Height          = height;

                // Create an output stream
                byte[] frameData = new byte[stream.Width * stream.Height * 4];

                // Retrieve all iamges for this batch
                string[] images = Directory.GetFiles(path, string.Format("{0}*.jpg", renderGuid));

                // Process image per image
                foreach (string file in images)
                {
                    // Decode the bitmap
                    JpegBitmapDecoder decoder = new JpegBitmapDecoder(new Uri(file), BitmapCreateOptions.None, BitmapCacheOption.Default);

                    // Get bitmap source
                    BitmapSource source = decoder.Frames[0];

                    // Copy pixels
                    source.CopyPixels(frameData, 1920 * 4, 0);

                    // Write it to the stream
                    stream.WriteFrame(true, frameData, 0, frameData.Length);
                }

                // Close writer
                writer.Close();

                return(outputPath);
            });

            await renderT;

            return(renderT.Result);
        }
        public VideoRecorder()
        {
            forceStop = false;
            writer = null;
            stream = null;

            if (streamingTask != null)
            {
                streamingTask.Dispose();
                streamingTask = null;
            }
        }
Esempio n. 18
0
        /// <summary>
        /// Frees all resources used by this object.
        /// </summary>
        public void Dispose()
        {
            lock (_syncLock)
            {
                _writer.Close();
                _writer = null;

                _videoStream = null;
                _audioStream = null;
            }

            _videoBuffer = null;
        }
Esempio n. 19
0
 /// <summary>
 /// 结束Avi录制
 /// </summary>
 public void Stoping()
 {
     if (_writer != null)
     {
         //关闭Writer,生成完整的,并且有时间轴的AVI文件
         _writer.Close();
         _writer = null;
         _stream = null;
     }
     //录制完毕,赋值标志位
     IsCreateRecord = false;
     IsRecording    = false;
     IsStopRecord   = false;
 }
Esempio n. 20
0
        public Recorder(RecorderParams Params)
        {
            this.Params = Params;

            writer      = Params.CreateAviWriter();
            videoStream = Params.CreateVideoStream(writer);

            screenThread = new Thread(RecordScreen)
            {
                Name         = typeof(Recorder).Name + ".RecordScreen",
                IsBackground = true
            };

            screenThread.Start();
        }
Esempio n. 21
0
        void Record()
        {
            int  FrameRate = (int)FpsUpDown.Value;
            Size RSize     = RecordPanel.Size;

            int       RndNum            = new Random().Next();
            string    OutFile           = Path.GetFullPath(string.Format("rec_{0}.avi", RndNum));
            string    OutFileCompressed = Path.GetFullPath(string.Format("rec_{0}.webm", RndNum));
            AviWriter Writer            = new AviWriter(OutFile);

            Writer.FramesPerSecond = FrameRate;
            Writer.EmitIndex1      = true;

            IAviVideoStream VStream = Writer.AddVideoStream(RSize.Width, RSize.Height, BitsPerPixel.Bpp24);

            VStream.Codec        = KnownFourCCs.Codecs.Uncompressed;
            VStream.BitsPerPixel = BitsPerPixel.Bpp24;

            Bitmap   Bmp = new Bitmap(RSize.Width, RSize.Height);
            Graphics G   = Graphics.FromImage(Bmp);

            Stopwatch SWatch = new Stopwatch();

            SWatch.Start();

            while (!AbortRecording)
            {
                G.CopyFromScreen(DesktopLocation.Add(RecorderOffset), Point.Empty, RSize);
                //G.DrawString("Text Embedding", SystemFonts.CaptionFont, Brushes.Red, new PointF(0, 0));
                Bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
                byte[] Data = Bmp.ToByteArray();
                VStream.WriteFrame(true, Data, 0, Data.Length);
                while ((float)SWatch.ElapsedMilliseconds / 1000 < 1.0f / FrameRate)
                {
                    ;
                }
                SWatch.Restart();
            }

            G.Dispose();
            Writer.Close();

            if (WebmCheckBox.Checked)
            {
                Program.FFMPEG("-i \"{0}\" -c:v libvpx -b:v 1M -c:a libvorbis \"{1}\"", OutFile, OutFileCompressed);
                File.Delete(OutFile);
            }
        }
Esempio n. 22
0
        public void Record()
        {
            _tempName = "Temp-" + DateTime.Now.Ticks + ".avi";
            var writer = new AviWriter(_tempName)
            {
                FramesPerSecond = 30,
            };

            IAviVideoStream stream    = writer.AddMotionJpegVideoStream(ScreenWidth, ScreenHeight);
            var             frameData = new byte[stream.Width * stream.Height * 4];

            var stopwatch = new Stopwatch();
            var buffer    = new byte[ScreenWidth * ScreenHeight * 4];

            var shotsTaken        = 0;
            var timeTillNextFrame = TimeSpan.Zero;

            Task videoWriteTask = null;
            var  isFirstFrame   = true;

            stopwatch.Start();
            while (!WaitHandler.WaitOne(timeTillNextFrame))
            {
                GetScreenshot(buffer);
                if (!isFirstFrame)
                {
                    videoWriteTask.Wait();
                }

                videoWriteTask    = stream.WriteFrameAsync(true, buffer, 0, buffer.Length);
                timeTillNextFrame = TimeSpan.FromSeconds(shotsTaken / (double)writer.FramesPerSecond - stopwatch.Elapsed.TotalSeconds);
                if (timeTillNextFrame < TimeSpan.Zero)
                {
                    timeTillNextFrame = TimeSpan.Zero;
                }

                isFirstFrame = false;
            }

            stopwatch.Stop();
            if (!isFirstFrame)
            {
                videoWriteTask.Wait();
            }

            writer.Close();
        }
Esempio n. 23
0
        public Recorder(RecorderParams Params)
        {
            this._params = Params;

            this._writer = Params.CreateAviWriter();

            this._videoStream      = Params.CreateVideoStream(this._writer);
            this._videoStream.Name = "DesktopCapture";

            this._screenThread = new Thread(this.RecordScreen)
            {
                Name         = typeof(Recorder).Name + ".RecordScreen",
                IsBackground = true
            };

            this._screenThread.Start();
        }
Esempio n. 24
0
        public void InitializeRecorder()
        {
            System.Windows.Media.Matrix toDevice;
            using (var source = new HwndSource(new HwndSourceParameters()))
            {
                toDevice = source.CompositionTarget.TransformToDevice;
            }
            mScreenWidth  = Screen.PrimaryScreen.Bounds.Width;
            mScreenHeight = Screen.PrimaryScreen.Bounds.Height;

            string currentDirectory = Environment.CurrentDirectory;
            string newDir           = Path.GetDirectoryName(Path.GetDirectoryName(currentDirectory));

            mFullPath = newDir + @"\SaveFolder\screenRecord.avi";



            mWriter = new AviWriter(mFullPath)
            {
                FramesPerSecond = 10,
                EmitIndex1      = true,
            };

            mVideoStream = CreateVideoStream(mCodecInfo.Codec, mQuality);

            mVideoStream.Name = "Screencast";



            suppForm    = SupportedWaveFormat.WAVE_FORMAT_44S16;
            mWaveFormat = ToWaveFormat(suppForm);


            mAudioStream      = CreateAudioStream(mWaveFormat, false, 160);
            mAudioStream.Name = "Voice";
            mAudioSource      = new WaveInEvent
            {
                DeviceNumber       = mAudioDevice.Value,
                WaveFormat         = mWaveFormat,
                BufferMilliseconds = (int)Math.Ceiling(1000 / mWriter.FramesPerSecond),
                NumberOfBuffers    = 3,
            };
            mAudioSource.DataAvailable += audioSource_DataAvailable;
        }
Esempio n. 25
0
        public void SaveAsAvi(string fileName)
        {
            var writer = new AviWriter(fileName)
            {
                FramesPerSecond = (1000000 + this.Header.FrameDelay / 2) / this.Header.FrameDelay,
                EmitIndex1      = true
            };

            try
            {
                IAviVideoStream videoStream = writer.AddMotionJpegVideoStream(this.Header.Width, this.Header.Height, 70);
                IAviAudioStream audioStream = writer.AddAudioStream(this.AudioHeader.NumChannels, this.AudioHeader.Frequency, 16);

                this.BeginPlay();

                try
                {
                    byte[] audio;
                    byte[] video;

                    while (this.RetrieveNextFrame(out audio, out video))
                    {
                        if (video != null)
                        {
                            byte[] buffer = SnmFile.Convert16BppTo32Bpp(video);
                            videoStream.WriteFrame(true, buffer, 0, buffer.Length);
                        }

                        if (audio != null)
                        {
                            audioStream.WriteBlock(audio, 0, audio.Length);
                        }
                    }
                }
                finally
                {
                    this.EndPlay();
                }
            }
            finally
            {
                writer.Close();
            }
        }
Esempio n. 26
0
        public void RecordScreen(RecorderParams recorderParams)
        {
            Params = recorderParams;
            writer = Params.CreateAviWriter();

            // Create video stream
            videoStream = Params.CreateVideoStream(writer);
            // Set only name. Other properties were when creating stream,
            // either explicitly by arguments or implicitly by the encoder used
            videoStream.Name = "Captura";

            screenThread = new Thread(_recordScreen)
            {
                Name         = typeof(ScreenRecorderHelper).Name + ".RecordScreen",
                IsBackground = true
            };

            screenThread.Start();
        }
Esempio n. 27
0
        private static void Process(IAviSettings aviSettings, IReadOnlyCollection <string> imageFiles)
        {
            if (imageFiles.Count == 0)
            {
                return;
            }

            using (var writer = new AviWriter(aviSettings.OutputAvi)
            {
                FramesPerSecond = aviSettings.FPS, EmitIndex1 = true
            })
            {
                IAviVideoStream stream    = null;
                byte[]          buffer    = null;
                bool            first     = true;
                var             rectangle = new Rectangle();

                foreach (var file in imageFiles)
                {
                    using (var bitmap = (Bitmap)Image.FromFile(file))
                    {
                        if (first)
                        {
                            first = false;

                            //stream = writer.AddUncompressedVideoStream(image.Width, image.Height);
                            stream = writer.AddMotionJpegVideoStream(bitmap.Width, bitmap.Height, quality: 90);
                            //stream = writer.AddMpeg4VideoStream(image.Width, image.Height, fps, quality: 70, codec: KnownFourCCs.Codecs.MicrosoftMpeg4V2, forceSingleThreadedAccess: true);

                            buffer    = new byte[bitmap.Width * bitmap.Height * 4 /* four bytes per pixel */];
                            rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
                        }


                        var raw = bitmap.LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                        Marshal.Copy(raw.Scan0, buffer, 0, buffer.Length);
                        bitmap.UnlockBits(raw);

                        stream.WriteFrame(true, buffer, 0, buffer.Length);
                    }
                }
            }
        }
 public Recorder(RecorderParams Params)
 {
     this.Params = Params;
     // Create AVI writer and specify FPS
     writer = Params.CreateAviWriter();
     // Create video stream
     videoStream = Params.CreateVideoStream(writer);
     // Set only name. Other properties were when creating stream, 
     // either explicitly by arguments or implicitly by the encoder used
     videoStream.Name = "Captura";
     if (Params.AudioSourceId != -1)
     {
         try
         {
             var waveFormat = Params.WaveFormat;
             audioStream = Params.CreateAudioStream(writer);
             audioStream.Name = "Voice";
             audioSource = new WaveInEvent
             {
                 DeviceNumber = Params.AudioSourceId,
                 WaveFormat = waveFormat,
                 // Buffer size to store duration of 1 frame
                 BufferMilliseconds = (int)Math.Ceiling(1000 / writer.FramesPerSecond),
                 NumberOfBuffers = 3,
             };
             audioSource.DataAvailable += AudioDataAvailable;
         }
         catch { }
     }
     screenThread = new Thread(RecordScreen)
     {
         Name = typeof(Recorder).Name + ".RecordScreen",
         IsBackground = true
     };
     if (audioSource != null)
     {
         videoFrameWritten.Set();
         audioBlockWritten.Reset();
         audioSource.StartRecording();
     }
     screenThread.Start();
 }
Esempio n. 29
0
            public Recorder(RecorderParams Params)
            {
                this.Params = Params;

                // Create AVI writer and specify FPS
                writer = Params.CreateAviWriter();

                // Create video stream
                videoStream = Params.CreateVideoStream(writer);
                // Set only name. Other properties were when creating stream,
                // either explicitly by arguments or implicitly by the encoder used
                videoStream.Name = "Cap - " + DateTime.Now.ToLongDateString();

                screenThread = new Thread(RecordScreen)
                {
                    Name         = typeof(Recorder).Name + ".RecordScreen",
                    IsBackground = true
                };

                screenThread.Start();
            }
Esempio n. 30
0
        public RecordingService(ScreenMetadata targetScreen, RegionBlock recordBlock, FourCC codec, int quality)
        {
            Debug.Assert(targetScreen != null);
            Debug.Assert(recordBlock != null);

            this.targetScreen = targetScreen;
            this.recordBlock  = recordBlock;

            videoWriter = new AviWriter($"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.avi", 10)
            {
                EmitIndex1 = true
            };

            videoStream      = CreateVideoStream(codec, quality);
            videoStream.Name = "Screencast";

            recordThread = new Thread(RecordScreen)
            {
                Name         = typeof(RecordingService).Name + ".RecordScreen",
                IsBackground = true
            };
        }
Esempio n. 31
0
        public void Start()
        {
            _fileWriter = new AviWriter(_outputFilePath)
            {
                FramesPerSecond = _configurator.FramePerSecond,
                EmitIndex1      = true
            };
            _videoStream = _fileWriter.AddEncodingVideoStream(_selectedEncoder, true, _configurator.Width, _configurator.Height);
            _frameData   = new byte[_videoStream.Width * _videoStream.Height * 4];
            _cts         = new CancellationTokenSource();

            _workTask = Task.Run(async() =>
            {
                Task writeTask = Task.FromResult(true);
                while (!_cts.IsCancellationRequested)
                {
                    GetSnapshot(_frameData);
                    await writeTask;
                    writeTask = _videoStream.WriteFrameAsync(true, _frameData, 0, _frameData.Length);
                }
                await writeTask;
            });
        }
        public void InitRecord(String filePath)
        {
            try
            {
                writer = new AviWriter(filePath)
                {
                    FramesPerSecond = 30,
                    // Emitting AVI v1 index in addition to OpenDML index (AVI v2)
                    // improves compatibility with some software, including
                    // standard Windows programs like Media Player and File Explorer
                    EmitIndex1 = true
                };

                stream = writer.AddMpeg4VideoStream(1920, 1080, 30,
                                                    quality: 70, codec: KnownFourCCs.Codecs.X264, forceSingleThreadedAccess: true);

                IsCreateRecord = false;
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message);
                WriteEduAppLog(ex.Message, ex.StackTrace);
            }
        }
Esempio n. 33
0
        private void LoadSettings()
        {
            try
            {
                writer = new AviWriter("test.avi")
                    {
                        FramesPerSecond = 25,
                        // Emitting AVI v1 index in addition to OpenDML index (AVI v2)
                        // improves compatibility with some software, including
                        // standard Windows programs like Media Player and File Explorer
                        EmitIndex1 = true
                    };

                var encoder = new Mpeg4VideoEncoderVcm((int)numericWidth.Value, (int)numericHeight.Value, 25, 0, 100, KnownFourCCs.Codecs.Xvid);
            //                stream = writer.AddMotionJpegVideoStream(640, 480, quality: 100);
                //stream = writer.AddMpeg4VideoStream(640, 480, 30, quality: 70, codec: KnownFourCCs.Codecs.X264, forceSingleThreadedAccess: true);
                stream = writer.AddEncodingVideoStream(encoder, true, (int)numericWidth.Value, (int)numericHeight.Value);

                // set standard VGA resolution
                //            stream.Width = 640;
                //            stream.Height = 480;
                // class SharpAvi.KnownFourCCs.Codecs contains FOURCCs for several well-known codecs
                // Uncompressed is the default value, just set it for clarity

                //stream.Codec = KnownFourCCs.Codecs.MotionJpeg;
                // Uncompressed format requires to also specify bits per pixel
                //stream.BitsPerPixel = BitsPerPixel.Bpp32;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Esempio n. 34
0
        private bool StartRecording()
        {
            int captureWidth = (int)(m_Capture.CaptureBounds.Width * m_Capture.Scale),
                captureHeight = (int)(m_Capture.CaptureBounds.Height * m_Capture.Scale),
                codecSelectedIndex = comboBox_videoCodec.SelectedIndex,
                codecQuality = Convert.ToInt32(textBox_recordQuality.Text);

            try
            {
                m_AviWriter = new AviWriter(m_AviFilePath)
                {
                    FramesPerSecond = m_Capture.FramesPerSecond,
                    EmitIndex1 = true,
                };

                if (codecSelectedIndex == 0)
                {
                    m_AviVideoStream = m_AviWriter.AddVideoStream(captureWidth, captureHeight);
                }
                else if (codecSelectedIndex == 1)
                {
                    m_AviVideoStream = m_AviWriter.AddMotionJpegVideoStream(captureWidth, captureHeight, codecQuality);
                }
                else
                {
                    var codecs = Mpeg4VideoEncoderVcm.GetAvailableCodecs();
                    var encoder = new Mpeg4VideoEncoderVcm(captureWidth, captureHeight, m_Capture.FramesPerSecond, 0, codecQuality, codecs[codecSelectedIndex - 2].Codec);
                    m_AviVideoStream = m_AviWriter.AddEncodingVideoStream(encoder);
                }


                if (checkBox_recordAudio.Checked)
                {
                    m_AviAudioStream = m_AviWriter.AddAudioStream(m_Recorder.WaveFormat.Channels, m_Recorder.WaveFormat.SampleRate, m_Recorder.WaveFormat.BitsPerSample);
                }
            }
            catch
            {
                Debug.Log("Failed to Start Recording.");
                return false;
            }

            return true;
        }
Esempio n. 35
0
        /// <summary>
        /// 画面キャプチャ(音声録音)の停止
        /// </summary>
        private void StopCapture()
        {
            foreach (var pair in m_WebSocketClients)
            {
                var data = new MessageData { type = MessageData.Type.StopCapture };
                var json = JsonConvert.SerializeObject(data);

                pair.Value.Send(json);
            }

            m_Capture.StopAsync();

            if (checkBox_sendAudio.Checked || checkBox_recordAudio.Checked)
            {
                m_Recorder.StopRecording();
            }

            if (m_AviWriter != null)
            {
                Debug.Log("" + m_AviVideoStream.FramesWritten);
                m_AviWriter.Close();
                m_AviWriter = null;
                m_AviVideoStream = null;
                m_AviAudioStream = null;
            }
        }
Esempio n. 36
0
        public Recorder(RecorderParams Params)
        {
            this.Params = Params;

            if (Params.CaptureVideo)
            {
                // Create AVI writer and specify FPS
                writer = Params.CreateAviWriter();

                // Create video stream
                videoStream = Params.CreateVideoStream(writer);
                // Set only name. Other properties were when creating stream,
                // either explicitly by arguments or implicitly by the encoder used
                videoStream.Name = "Captura";
            }

            try
            {
                int AudioSourceId = int.Parse(Params.AudioSourceId);

                if (AudioSourceId != -1)
                {
                    if (Params.CaptureVideo)
                    {
                        audioStream = Params.CreateAudioStream(writer);
                        audioStream.Name = "Voice";
                    }

                    audioSource = new WaveInEvent
                    {
                        DeviceNumber = AudioSourceId,
                        WaveFormat = Params.WaveFormat,
                        // Buffer size to store duration of 1 frame
                        BufferMilliseconds = (int)Math.Ceiling(1000 / writer.FramesPerSecond),
                        NumberOfBuffers = 3,
                    };
                }
            }
            catch
            {
                var dev = Params.LoopbackDevice;

                SilencePlayer = new WasapiOut(dev, AudioClientShareMode.Shared, false, 100);

                SilencePlayer.Init(new SilenceProvider(Params.WaveFormat));

                SilencePlayer.Play();

                if (Params.CaptureVideo)
                {
                    audioStream = Params.CreateAudioStream(writer);
                    audioStream.Name = "Loopback";
                }

                audioSource = new WasapiLoopbackCapture(dev) { ShareMode = AudioClientShareMode.Shared };
            }

            if (Params.CaptureVideo)
            {
                screenThread = new Thread(RecordScreen)
                {
                    Name = typeof(Recorder).Name + ".RecordScreen",
                    IsBackground = true
                };
            }
            else WaveWriter = Params.CreateWaveWriter();

            if (Params.CaptureVideo) screenThread.Start();

            if (audioSource != null)
            {
                audioSource.DataAvailable += AudioDataAvailable;

                if (Params.CaptureVideo)
                {
                    videoFrameWritten.Set();
                    audioBlockWritten.Reset();
                }

                audioSource.StartRecording();
            }
        }
Esempio n. 37
0
        /// <summary>
        /// Records this instance.
        /// </summary>
        /// <exception cref="RedCell.Research.ResearchException">
        /// Filename must be set before recording.
        /// or
        /// A recording has already started.
        /// </exception>
        /// <exception cref="System.InvalidOperationException">Filename must be set before recording.</exception>
        public void StartRecord()
        {
            // Automatic filename
            if (string.IsNullOrWhiteSpace(Filename))
                Filename = "Video_" + DateTime.Now.ToString("yyyyMMddHHmmss");

            if(_writer != null)
                throw new ResearchException("A recording has already started.");

            // Get video details from camera.
            if (StreamSetting == null)
                StreamSetting = Camera.StreamSetting;

            var encoder = new Mpeg4VideoEncoderVcm(StreamSetting.Width, StreamSetting.Height, StreamSetting.Framerate, 0, 50, KnownFourCCs.Codecs.X264);
            _writer = new AviWriter(Filename);
            _video = _writer.AddEncodingVideoStream(encoder, true, StreamSetting.Width, StreamSetting.Height);
            

            Camera.FrameAvailable += Camera_FrameAvailable;
        }
Esempio n. 38
0
 internal MJpegAviFrameWriter(IAviVideoStream writer)
 {
     _Writer = writer;
     _Cache  = new MemoryBitmap <Pixel.BGRA32>(writer.Width, writer.Height, Pixel.BGRA32.Format);
 }
Esempio n. 39
0
        public Recorder(string filePath,
                        int quality, int x, int y, int width, int height, bool captureCursor,
                        int inputSourceIndex, bool separateAudio)
        {
            this.x             = x;
            this.y             = y;
            this.width         = width;
            this.height        = height;
            this.captureCursor = captureCursor;

            writer = new AviWriter(filePath)
            {
                FramesPerSecond = 15,
                EmitIndex1      = true,
            };

            if (quality == 0)
            {
                videoStream      = writer.AddUncompressedVideoStream(width, height);
                videoStream.Name = "Quick Screen Recorder - Motion JPEG video stream";
            }
            else
            {
                videoStream      = writer.AddMotionJpegVideoStream(width, height, quality);
                videoStream.Name = "Quick Screen Recorder - Motion JPEG video stream";
            }

            if (inputSourceIndex >= 0)
            {
                var waveFormat = new WaveFormat(44100, 16, 1);

                audioStream = writer.AddAudioStream(
                    channelCount: waveFormat.Channels,
                    samplesPerSecond: waveFormat.SampleRate,
                    bitsPerSample: waveFormat.BitsPerSample
                    );
                audioStream.Name = "Quick Screen Recorder - Input audio stream";

                audioSource = new WaveInEvent()
                {
                    DeviceNumber       = inputSourceIndex,
                    WaveFormat         = waveFormat,
                    BufferMilliseconds = (int)Math.Ceiling(1000 / writer.FramesPerSecond),
                    NumberOfBuffers    = 3,
                };
                audioSource.DataAvailable += audioSource_DataAvailable;

                if (separateAudio)
                {
                    waveFile = new WaveFileWriter(filePath + " (Input audio).wav", audioSource.WaveFormat);
                }
            }
            else if (inputSourceIndex == -1)
            {
                audioSource = new WasapiLoopbackCapture();

                audioStream = writer.AddAudioStream(
                    channelCount: 1,
                    samplesPerSecond: audioSource.WaveFormat.SampleRate,
                    bitsPerSample: audioSource.WaveFormat.BitsPerSample
                    );
                audioStream.Name = "Quick Screen Recorder - System sounds audio stream";

                audioSource.DataAvailable += audioSource_DataAvailable;

                if (separateAudio)
                {
                    waveFile = new WaveFileWriter(filePath + " (System sounds).wav", audioSource.WaveFormat);
                }
            }

            screenThread = new Thread(RecordScreen)
            {
                Name         = typeof(Recorder).Name + ".RecordScreen",
                IsBackground = true
            };

            if (audioSource != null)
            {
                videoFrameWritten.Set();
                audioBlockWritten.Reset();
                audioSource.StartRecording();
            }

            tf.compat.v1.disable_eager_execution();

            //var tfSession = tf.Session();

            detectorGraph = tf.Graph().as_default();

            detectorGraph.Import(Path.Combine(modelDir, pbDetectorFile));

            emotionGraph = tf.Graph().as_default();
            emotionGraph.Import(Path.Combine(modelDir, pbEmotionFile));

            Console.WriteLine(Environment.OSVersion, Color.Yellow);
            Console.WriteLine($"64Bit Operating System: {Environment.Is64BitOperatingSystem}", Color.Yellow);
            Console.WriteLine($"TensorFlow.NET v{Assembly.GetAssembly(typeof(TF_DataType)).GetName().Version}", Color.Yellow);
            Console.WriteLine($"TensorFlow Binary v{tf.VERSION}", Color.Yellow);
            Console.WriteLine($".NET CLR: {Environment.Version}", Color.Yellow);
            Console.WriteLine(Environment.CurrentDirectory, Color.Yellow);

            //writerCSV = new StreamWriter("output.csv");
            //csv = new CsvWriter(writerCSV, CultureInfo.InvariantCulture);
            using (var writer = new StreamWriter("output.csv"))
                using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
                {
                    csv.WriteHeader <CSVRecord>();
                    csv.NextRecord();
                }

            screenThread.Start();
        }