/// <summary>
        /// Build ffmpeg args for Windows
        /// </summary>
        /// <returns>FFmpeg arguments for recording</returns>
        public Dictionary <string, string> ForWindows(Dictionary <string, string> d, RecordingSettings rs, DeviceManager dm)
        {
            #region Add audio devices
            string audioDevices = String.Empty;

            foreach (var ad in rs.AudioDevicesToRecord)
            {
                audioDevices += $" -f dshow -i audio=\"{ad.Name}\"";
            }

            d.Add($"audioDevices", audioDevices);
            #endregion

            #region Add video device
            // Add directshow
            d.Add("dshow", $"-f dshow");

            string videoDevice;

            if (rs.VideoDevice.ToLower().EqualsAnyOf("default", "desktop screen", dm.DesktopVideoDevice))
            {
                videoDevice = $"-i video=\"{dm.DesktopVideoDevice}\"";
            }
            else
            {
                videoDevice = $"-i video=\"{rs.VideoDevice}\"";
            }

            d.Add("videoDevice", videoDevice);
            #endregion

            #region Audio mapping
            d.Add("maps", GetAudioMaps((rs.SeperateAudioTracks == "true") ? true : false, rs.AudioDevicesToRecord));
            #endregion

            #region FPS
            // Add FPS if it's an integer, otherwise default to 30
            d.Add("fps", $"-framerate {GetFPS(rs.FPS)}");
            #endregion

            #region Resolution
            d.Add("res", $"-video_size {GetResolution(rs.Resolution)}");
            #endregion

            #region Other
            // Zero Latency
            if (rs.ZeroLatency == "true")
            {
                d.Add("tune", "-tune zerolatency");
            }

            // Ultra Fast
            if (rs.UltraFast == "true")
            {
                d.Add("preset", "-preset ultrafast");
            }
            #endregion

            #region Video Output Location & Format
            d.Add("videoOutput", $"\"{GetVideoOutput(PathHelper.FolderPath(rs.VideoSaveFolder), DateTimeCodeConverter.Convert(rs.VideoSaveName), GetVideoFormat(rs.Format))}\"");
            #endregion

            return(d);
        }
        /// <summary>
        /// Build ffmpeg args for Linux
        /// </summary>
        /// <returns>FFmpeg arguments for recording</returns>
        public Dictionary <string, string> ForLinux(Dictionary <string, string> d, RecordingSettings rs, DeviceManager dm)
        {
            #region Add Pulse Inputs
            // Add audio devices
            foreach (var ad in rs.AudioDevicesToRecord)
            {
                d.Add($"pulse{ad.SourceNumber}", $"-f pulse -i {ad.SourceNumber}");
            }
            #endregion

            #region Video Settings
            // Put video settings before x11grab device to make sure they actually apply

            // Recording FPS
            d.Add("fps", $"-framerate {GetFPS(rs.FPS)}");

            // Recording Resolution
            d.Add("res", $"-video_size {GetResolution(rs.Resolution)}");

            // Add x11grab
            d.Add("x11grab", $"-f x11grab");

            // Region on desktop to record
            d.Add("desktopRegion", "-i :0.0+0,0");
            #endregion

            #region Audio mapping
            d.Add("maps", GetAudioMaps((rs.SeperateAudioTracks == "true") ? true : false, rs.AudioDevicesToRecord));
            #endregion

            // Video output path
            d.Add("videoOutput", $"\"{GetVideoOutput(PathHelper.FolderPath(rs.VideoSaveFolder), DateTimeCodeConverter.Convert(rs.VideoSaveName), GetVideoFormat(rs.Format))}\"");

            return(d);
        }