{"record":{"id":"6c342dc408697ce2","repo":"MathewSachin/Captura","slug":"ffmpeg-could-not-be-found-please-download-using-t-6c342d","errorCode":null,"errorMessage":"FFmpeg could not be found. Please download using the in-built downloader.","messagePattern":"FFmpeg could not be found\\. Please download using the in-built downloader\\.","errorType":"exception","errorClass":"FFmpegNotFoundException","httpStatus":null,"severity":"error","filePath":"src/Captura.FFmpeg/Video/FFmpegVideoConverter.cs","lineNumber":25,"sourceCode":"    // ReSharper disable once InconsistentNaming\n    class FFmpegVideoConverter : IVideoConverter\n    {\n        readonly FFmpegVideoCodec _videoCodec;\n\n        public FFmpegVideoConverter(FFmpegVideoCodec VideoCodec)\n        {\n            _videoCodec = VideoCodec;\n        }\n\n        public string Name => $\"{_videoCodec.Name} (FFmpeg)\";\n\n        public string Extension => _videoCodec.Extension;\n\n        public async Task StartAsync(VideoConverterArgs Args, IProgress<int> Progress)\n        {\n            if (!FFmpegService.FFmpegExists)\n            {\n                throw new FFmpegNotFoundException();\n            }\n\n            var argsBuilder = new FFmpegArgsBuilder();\n\n            argsBuilder.AddInputFile(Args.InputFile);\n\n            var output = argsBuilder.AddOutputFile(Args.FileName)\n                .SetFrameRate(Args.FrameRate);\n\n            _videoCodec.Apply(ServiceProvider.Get<FFmpegSettings>(), Args, output);\n\n            //if (Args.AudioProvider != null)\n            {\n                _videoCodec.AudioArgsProvider(Args.AudioQuality, output);\n            }\n\n            var process = FFmpegService.StartFFmpeg(argsBuilder.GetArgs(), Args.FileName, out var log);\n","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/MathewSachin/Captura/blob/3fdf41529bf4d50cd7a85aedd856f30e34279a47/src/Captura.FFmpeg/Video/FFmpegVideoConverter.cs#L7-L43","documentation":"Thrown by FFmpegVideoConverter.StartAsync (src/Captura.FFmpeg/Video/FFmpegVideoConverter.cs:25) when FFmpegService.FFmpegExists is false. The video converter cannot transcode without an ffmpeg binary, so it guards entry identically to the audio/GIF converters.","triggerScenarios":"Starting a video conversion while FFmpegService.FFmpegExists is false (no ffmpeg.exe in folder/app/lib/PATH).","commonSituations":"Fresh install where the downloader has not been run; FFmpeg folder setting cleared; ffmpeg removed from PATH.","solutions":["Ensure ffmpeg is downloaded via the in-built downloader before conversions are exposed in the UI.","Validate the FFmpeg folder setting resolves to a real ffmpeg.exe.","Ship or place ffmpeg.exe in the app/lib directory as a fallback."],"exampleFix":"// before\nawait new FFmpegVideoConverter(codec).StartAsync(args, progress);\n// after\nif (!FFmpegService.FFmpegExists)\n    await DownloadFFmpeg.Run();\nawait new FFmpegVideoConverter(codec).StartAsync(args, progress);","handlingStrategy":"validation","validationCode":"if (!FFmpegService.FFmpegExists) await DownloadFFmpeg.Run();\nif (!FFmpegService.FFmpegExists) throw new FFmpegNotFoundException();","typeGuard":null,"tryCatchPattern":"try { await new FFmpegVideoConverter(codec).StartAsync(args, progress); }\ncatch (FFmpegNotFoundException) { /* download then retry once */ }","preventionTips":["Gate the video-conversion UI behind FFmpegService.FFmpegExists.","Auto-run the downloader on first launch.","Re-verify after the FFmpeg folder setting is edited."],"tags":["ffmpeg","configuration","dependency-missing","csharp"],"backgroundTag":null,"analyzedSha":"3fdf41529bf4d50cd7a85aedd856f30e34279a47","analyzedAt":"2026-08-13T19:35:27.486Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}