示例#1
0
        public string GetFFmpegCommands()
        {
            string commands;

            if (IsRecording && !string.IsNullOrEmpty(FFmpeg.VideoSource) && FFmpeg.VideoSource.Equals("screen-capture-recorder", StringComparison.InvariantCultureIgnoreCase))
            {
                // https://github.com/rdp/screen-capture-recorder-to-video-windows-free
                string registryPath = "Software\\screen-capture-recorder";
                RegistryHelpers.CreateRegistry(registryPath, "start_x", CaptureArea.X);
                RegistryHelpers.CreateRegistry(registryPath, "start_y", CaptureArea.Y);
                RegistryHelpers.CreateRegistry(registryPath, "capture_width", CaptureArea.Width);
                RegistryHelpers.CreateRegistry(registryPath, "capture_height", CaptureArea.Height);
                RegistryHelpers.CreateRegistry(registryPath, "default_max_fps", 60);
                RegistryHelpers.CreateRegistry(registryPath, "capture_mouse_default_1", DrawCursor ? 1 : 0);
            }

            if (!IsLossless && FFmpeg.UseCustomCommands && !string.IsNullOrEmpty(FFmpeg.CustomCommands))
            {
                commands = FFmpeg.CustomCommands.
                           Replace("$fps$", FPS.ToString(), StringComparison.InvariantCultureIgnoreCase).
                           Replace("$area_x$", CaptureArea.X.ToString(), StringComparison.InvariantCultureIgnoreCase).
                           Replace("$area_y$", CaptureArea.Y.ToString(), StringComparison.InvariantCultureIgnoreCase).
                           Replace("$area_width$", CaptureArea.Width.ToString(), StringComparison.InvariantCultureIgnoreCase).
                           Replace("$area_height$", CaptureArea.Height.ToString(), StringComparison.InvariantCultureIgnoreCase).
                           Replace("$cursor$", DrawCursor ? "1" : "0", StringComparison.InvariantCultureIgnoreCase).
                           Replace("$duration$", Duration.ToString("0.0", CultureInfo.InvariantCulture), StringComparison.InvariantCultureIgnoreCase).
                           Replace("$output$", Path.ChangeExtension(OutputPath, FFmpeg.Extension), StringComparison.InvariantCultureIgnoreCase);
            }
            else
            {
                commands = GetFFmpegArgs();
            }

            return(commands.Trim());
        }
示例#2
0
        public string GetFFmpegCommands()
        {
            if (!string.IsNullOrEmpty(FFmpeg.VideoSource) && FFmpeg.VideoSource.Equals("screen-capture-recorder", StringComparison.InvariantCultureIgnoreCase))
            {
                // https://github.com/rdp/screen-capture-recorder-to-video-windows-free
                string registryPath = "Software\\screen-capture-recorder";
                RegistryHelpers.CreateRegistry(registryPath, "start_x", CaptureArea.X);
                RegistryHelpers.CreateRegistry(registryPath, "start_y", CaptureArea.Y);
                RegistryHelpers.CreateRegistry(registryPath, "capture_width", CaptureArea.Width);
                RegistryHelpers.CreateRegistry(registryPath, "capture_height", CaptureArea.Height);
                RegistryHelpers.CreateRegistry(registryPath, "default_max_fps", ScreenRecordFPS);
                RegistryHelpers.CreateRegistry(registryPath, "capture_mouse_default_1", DrawCursor ? 1 : 0);
            }

            if (FFmpeg.UseCustomCommands && !string.IsNullOrEmpty(FFmpeg.CustomCommands))
            {
                string commands = FFmpeg.CustomCommands.Trim();

                // Replace output path
                if (commands[commands.Length - 1] == '"')
                {
                    int index = commands.LastIndexOf('"', commands.Length - 2);

                    if (index >= 0)
                    {
                        commands  = commands.Remove(index);
                        commands += string.Format("\"{0}\"", Path.ChangeExtension(OutputPath, FFmpeg.Extension));
                    }
                }

                return(commands);
            }

            return(GetFFmpegArgs());
        }
示例#3
0
        private static void RegisterCustomUploaderExtension()
        {
            RegistryHelpers.CreateRegistry(ShellCustomUploaderExtensionPath, ShellCustomUploaderExtensionValue);
            RegistryHelpers.CreateRegistry(ShellCustomUploaderAssociatePath, ShellCustomUploaderAssociateValue);
            RegistryHelpers.CreateRegistry(ShellCustomUploaderIconPath, ShellCustomUploaderIconValue);
            RegistryHelpers.CreateRegistry(ShellCustomUploaderCommandPath, ShellCustomUploaderCommandValue);

            NativeMethods.SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
        }
示例#4
0
        private static void RegisterShellContextMenuButton()
        {
            RegistryHelpers.CreateRegistry(ShellExtMenuFiles, ShellExtDesc);
            RegistryHelpers.CreateRegistry(ShellExtMenuFiles, "Icon", ShellExtIcon);
            RegistryHelpers.CreateRegistry(ShellExtMenuFilesCmd, ShellExtPath);

            RegistryHelpers.CreateRegistry(ShellExtMenuDirectory, ShellExtDesc);
            RegistryHelpers.CreateRegistry(ShellExtMenuDirectory, "Icon", ShellExtIcon);
            RegistryHelpers.CreateRegistry(ShellExtMenuDirectoryCmd, ShellExtPath);
        }
示例#5
0
        private static void RegisterEditShellContextMenuButton()
        {
            RegistryHelpers.CreateRegistry(ShellExtEditMenuJpeg, ShellExtEditDesc);
            RegistryHelpers.CreateRegistry(ShellExtEditMenuJpeg, "Icon", ShellExtEditIcon);
            RegistryHelpers.CreateRegistry(ShellExtEditMenuJpegCmd, ShellExtEditPath);

            RegistryHelpers.CreateRegistry(ShellExtEditMenuPng, ShellExtEditDesc);
            RegistryHelpers.CreateRegistry(ShellExtEditMenuPng, "Icon", ShellExtEditIcon);
            RegistryHelpers.CreateRegistry(ShellExtEditMenuPngCmd, ShellExtEditPath);
        }
示例#6
0
        private static void RegisterFirefoxAddonSupport()
        {
            CreateFirefoxHostManifest(Program.FirefoxHostManifestFilePath);

            RegistryHelpers.CreateRegistry(FirefoxNativeMessagingHosts, Program.FirefoxHostManifestFilePath);
        }
示例#7
0
        private static void RegisterChromeExtensionSupport()
        {
            CreateChromeHostManifest(Program.ChromeHostManifestFilePath);

            RegistryHelpers.CreateRegistry(ChromeNativeMessagingHosts, Program.ChromeHostManifestFilePath);
        }
示例#8
0
        public string GetFFmpegArgs()
        {
            StringBuilder args = new StringBuilder();

            // input FPS
            args.AppendFormat("-r {0} ", ScreenRecordFPS);

            if (string.IsNullOrEmpty(FFmpeg.VideoSource) || FFmpeg.VideoSource.Equals(FFmpegHelper.GDIgrab, StringComparison.InvariantCultureIgnoreCase))
            {
                // http://ffmpeg.org/ffmpeg-devices.html#gdigrab
                args.AppendFormat("-f gdigrab -framerate {0} -offset_x {1} -offset_y {2} -video_size {3}x{4} -draw_mouse {5} -show_region {6} -i desktop ",
                                  ScreenRecordFPS, CaptureArea.X, CaptureArea.Y, CaptureArea.Width, CaptureArea.Height, DrawCursor ? 1 : 0, 0);

                if (FFmpeg.IsAudioSourceSelected())
                {
                    args.AppendFormat("-f dshow -i audio=\"{0}\" ", FFmpeg.AudioSource);
                }
            }
            else
            {
                // https://github.com/rdp/screen-capture-recorder-to-video-windows-free configuration section
                string dshowRegistryPath = "Software\\screen-capture-recorder";
                RegistryHelpers.CreateRegistry(dshowRegistryPath, "start_x", CaptureArea.X);
                RegistryHelpers.CreateRegistry(dshowRegistryPath, "start_y", CaptureArea.Y);
                RegistryHelpers.CreateRegistry(dshowRegistryPath, "capture_width", CaptureArea.Width);
                RegistryHelpers.CreateRegistry(dshowRegistryPath, "capture_height", CaptureArea.Height);
                RegistryHelpers.CreateRegistry(dshowRegistryPath, "default_max_fps", ScreenRecordFPS);
                RegistryHelpers.CreateRegistry(dshowRegistryPath, "capture_mouse_default_1", DrawCursor ? 1 : 0);

                args.Append("-f dshow -i ");

                // dshow audio/video device: https://github.com/rdp/screen-capture-recorder-to-video-windows-free
                args.AppendFormat("video=\"{0}\"", FFmpeg.VideoSource);

                if (FFmpeg.IsAudioSourceSelected())
                {
                    args.AppendFormat(":audio=\"{0}\" ", FFmpeg.AudioSource);
                }
                else
                {
                    args.Append(" ");
                }
            }

            if (!string.IsNullOrEmpty(FFmpeg.UserArgs))
            {
                args.Append(FFmpeg.UserArgs + " ");
            }

            args.AppendFormat("-c:v {0} ", FFmpeg.VideoCodec.ToString());

            // output FPS
            args.AppendFormat("-r {0} ", ScreenRecordFPS);

            switch (FFmpeg.VideoCodec)
            {
            case FFmpegVideoCodec.libx264:     // https://trac.ffmpeg.org/wiki/x264EncodingGuide
                args.AppendFormat("-crf {0} ", FFmpeg.x264_CRF);
                args.AppendFormat("-preset {0} ", FFmpeg.Preset.ToString());
                break;

            case FFmpegVideoCodec.libvpx:     // https://trac.ffmpeg.org/wiki/vpxEncodingGuide
                args.AppendFormat("-crf {0} ", FFmpeg.VPx_CRF);
                break;

            case FFmpegVideoCodec.libxvid:     // https://trac.ffmpeg.org/wiki/How%20to%20encode%20Xvid%20/%20DivX%20video%20with%20ffmpeg
                args.AppendFormat("-qscale:v {0} ", FFmpeg.XviD_qscale);
                break;
            }

            // -pix_fmt yuv420p required for libx264 otherwise can't stream in Chrome
            if (FFmpeg.VideoCodec == FFmpegVideoCodec.libx264)
            {
                args.Append("-pix_fmt yuv420p -tune zerolatency ");
            }

            if (FFmpeg.IsAudioSourceSelected())
            {
                switch (FFmpeg.AudioCodec)
                {
                case FFmpegAudioCodec.libvorbis:     // http://trac.ffmpeg.org/wiki/TheoraVorbisEncodingGuide
                    args.AppendFormat("-c:a {0} -qscale:a {1} ", FFmpegAudioCodec.libvorbis.ToString(), FFmpeg.Vorbis_qscale);
                    break;

                case FFmpegAudioCodec.libmp3lame:     // http://trac.ffmpeg.org/wiki/Encoding%20VBR%20(Variable%20Bit%20Rate)%20mp3%20audio
                    args.AppendFormat("-c:a {0} -qscale:a {1} ", FFmpegAudioCodec.libmp3lame.ToString(), FFmpeg.MP3_qscale);
                    break;

                case FFmpegAudioCodec.libvoaacenc:                                               // http://trac.ffmpeg.org/wiki/AACEncodingGuide
                    args.AppendFormat("-c:a libvo_aacenc -ac 2 -b:a {0}k ", FFmpeg.AAC_bitrate); // -ac 2 required otherwise failing with 7.1
                    break;
                }
            }

            if (Duration > 0)
            {
                args.AppendFormat("-t {0} ", Duration);
            }

            // -y for overwrite file
            args.Append("-y ");

            args.AppendFormat("\"{0}\"", Path.ChangeExtension(OutputPath, FFmpeg.Extension));

            return(args.ToString());
        }