public bool StartRecording(string FileName = null) { if (VideoViewModel.SelectedVideoWriterKind is FFmpegWriterProvider || VideoViewModel.SelectedVideoWriterKind is StreamingWriterProvider || (VideoViewModel.SelectedVideoSourceKind is NoVideoSourceProvider && VideoViewModel.SelectedVideoSource is FFmpegAudioItem)) { if (!FFmpegService.FFmpegExists) { ServiceProvider.MessageProvider.ShowFFmpegUnavailable(); return(false); } } if (VideoViewModel.SelectedVideoWriterKind is GifWriterProvider) { if (Settings.Audio.Enabled) { if (!ServiceProvider.MessageProvider.ShowYesNo("Audio won't be included in the recording.\nDo you want to record?", "Gif does not support Audio")) { return(false); } } } IImageProvider imgProvider; try { imgProvider = GetImageProvider(); } catch (NotSupportedException e) when(VideoViewModel.SelectedVideoSourceKind is DeskDuplSourceProvider) { var yes = ServiceProvider.MessageProvider.ShowYesNo($"{e.Message}\n\nDo you want to turn off Desktop Duplication.", Loc.ErrorOccurred); if (yes) { VideoViewModel.SelectedVideoSourceKind = VideoViewModel.AvailableVideoSourceKinds[0]; } return(false); } catch (Exception e) { ServiceProvider.MessageProvider.ShowException(e, e.Message); return(false); } // Window Picker or Screen Picker Cancelled if ((VideoViewModel.SelectedVideoSource is WindowPickerItem || VideoViewModel.SelectedVideoSource is ScreenPickerItem) && imgProvider == null) { return(false); } if (VideoViewModel.SelectedVideoWriterKind is GifWriterProvider && Settings.Gif.VariableFrameRate && imgProvider is DeskDuplImageProvider deskDuplImageProvider) { deskDuplImageProvider.Timeout = 5000; } Settings.EnsureOutPath(); _isVideo = !(VideoViewModel.SelectedVideoSourceKind is NoVideoSourceProvider); var extension = VideoViewModel.SelectedVideoWriter.Extension; if (VideoViewModel.SelectedVideoSource is NoVideoItem x) { extension = x.Extension; } _currentFileName = FileName ?? Path.Combine(Settings.OutPath, $"{DateTime.Now:yyyy-MM-dd-HH-mm-ss}{extension}"); IAudioProvider audioProvider = null; try { if (Settings.Audio.Enabled) { audioProvider = AudioSource.GetAudioProvider(Settings.Video.FrameRate); } } catch (Exception e) { ServiceProvider.MessageProvider.ShowException(e, e.Message); imgProvider?.Dispose(); return(false); } IVideoFileWriter videoEncoder; try { videoEncoder = GetVideoFileWriter(imgProvider, audioProvider); } catch (Exception e) { ServiceProvider.MessageProvider.ShowException(e, e.Message); imgProvider?.Dispose(); audioProvider?.Dispose(); return(false); } switch (videoEncoder) { case GifWriter gif when Settings.Gif.VariableFrameRate: _recorder = new VFRGifRecorder(gif, imgProvider); break; case WithPreviewWriter previewWriter when previewWriter.OriginalWriter is GifWriter gif && Settings.Gif.VariableFrameRate: _recorder = new VFRGifRecorder(gif, imgProvider); break; default: if (_isVideo) { _recorder = new Recorder(videoEncoder, imgProvider, Settings.Video.FrameRate, audioProvider); } else if (VideoViewModel.SelectedVideoSource is NoVideoItem audioWriter) { _recorder = new Recorder(audioWriter.GetAudioFileWriter(_currentFileName, audioProvider?.WaveFormat, Settings.Audio.Quality), audioProvider); } break; } if (VideoViewModel.SelectedVideoSourceKind is RegionSourceProvider) { _regionProvider.Lock(); } _systemTray.HideNotification(); if (Settings.UI.MinimizeOnStart) { _mainWindow.IsMinimized = true; } RecorderState = RecorderState.Recording; _timer?.Stop(); TimeSpan = TimeSpan.Zero; Status.LocalizationKey = Settings.StartDelay > 0 ? nameof(LanguageManager.Waiting) : nameof(LanguageManager.Recording); _recorder.ErrorOccurred += E => { if (_syncContext != null) { _syncContext.Post(S => OnErrorOccurred(E), null); } else { OnErrorOccurred(E); } }; if (Settings.StartDelay > 0) { Task.Factory.StartNew(async() => { await Task.Delay(Settings.StartDelay); Status.LocalizationKey = nameof(LanguageManager.Recording); _recorder.Start(); }); } else { _recorder.Start(); } _timing?.Start(); _timer?.Start(); return(true); }
public bool StartRecording(string FileName = null) { if (VideoViewModel.SelectedVideoWriterKind is FFMpegWriterProvider || VideoViewModel.SelectedVideoWriterKind is StreamingWriterProvider || (VideoViewModel.SelectedVideoSourceKind is NoVideoSourceProvider && VideoViewModel.SelectedVideoSource is FFMpegAudioItem)) { if (!FFMpegService.FFMpegExists) { ServiceProvider.MessageProvider.ShowFFMpegUnavailable(); return(false); } FFMpegLog.Reset(); } if (VideoViewModel.SelectedVideoWriterKind is GifWriterProvider && Settings.GifVariable && VideoViewModel.SelectedVideoSourceKind is DeskDuplSourceProvider) { ServiceProvider.MessageProvider.ShowError("Using Variable Frame Rate GIF with Desktop Duplication is not supported."); return(false); } if (VideoViewModel.SelectedVideoWriterKind is GifWriterProvider) { if (AudioSource.AudioAvailable) { if (!ServiceProvider.MessageProvider.ShowYesNo("Audio won't be included in the recording.\nDo you want to record?", "Gif does not support Audio")) { return(false); } } } if (Duration != 0 && (StartDelay > Duration * 1000)) { ServiceProvider.MessageProvider.ShowError(Loc.DelayGtDuration); return(false); } IImageProvider imgProvider; try { imgProvider = GetImageProvider(); } catch (NotSupportedException e) when(VideoViewModel.SelectedVideoSourceKind is DeskDuplSourceProvider) { var yes = ServiceProvider.MessageProvider.ShowYesNo($"{e.Message}\n\nDo you want to turn off Desktop Duplication.", Loc.ErrorOccured); if (yes) { VideoViewModel.SelectedVideoSourceKind = ServiceProvider.Get <ScreenSourceProvider>(); } return(false); } catch (Exception e) { ServiceProvider.MessageProvider.ShowError(e.ToString()); return(false); } _regionProvider.Lock(); _systemTray.HideNotification(); if (Settings.UI.MinimizeOnStart) { _mainWindow.IsMinimized = true; } Settings.EnsureOutPath(); RecorderState = RecorderState.Recording; _isVideo = !(VideoViewModel.SelectedVideoSourceKind is NoVideoSourceProvider); var extension = VideoViewModel.SelectedVideoWriter.Extension; if (VideoViewModel.SelectedVideoSource is NoVideoItem x) { extension = x.Extension; } _currentFileName = FileName ?? Path.Combine(Settings.OutPath, $"{DateTime.Now:yyyy-MM-dd-HH-mm-ss}{extension}"); Status.LocalizationKey = StartDelay > 0 ? nameof(LanguageManager.Waiting) : nameof(LanguageManager.Recording); _timer?.Stop(); TimeSpan = TimeSpan.Zero; var audioProvider = AudioSource.GetAudioProvider(); var videoEncoder = GetVideoFileWriter(imgProvider, audioProvider); if (videoEncoder is GifWriter gif && Settings.GifVariable) { _recorder = new VFRGifRecorder(gif, imgProvider); }