SubtitleEdit/subtitleedit · error · Exception
No frames were extracted from the video - see log for the ff
Error message
No frames were extracted from the video - see log for the ffmpeg command line.
What it means
Thrown in VideoOcrViewModel.StartOcr after ExtractFrames runs ffmpeg to dump JPEGs into the temp frames folder: Directory.GetFiles returned zero *.jpg files, so the whole-video extraction produced nothing. Like 304 the actionable detail is the ffmpeg command line in the tools log. This blocks the entire OCR scan before grouping/OCR even begins.
Source
Thrown at src/ui/Features/Video/VideoOcr/VideoOcrViewModel.cs:679
_cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = _cancellationTokenSource.Token;
IsRunning = true;
IsOkEnabled = false;
ProgressValue = 0;
Lines.Clear();
var framesFolder = Path.Combine(Path.GetTempPath(), "se_video_ocr_" + Guid.NewGuid());
Directory.CreateDirectory(framesFolder);
try
{
await ExtractFrames(framesFolder, cancellationToken);
var frameFileNames = Directory.GetFiles(framesFolder, "*.jpg").OrderBy(p => p, StringComparer.Ordinal).ToList();
if (frameFileNames.Count == 0)
{
throw new Exception("No frames were extracted from the video - see log for the ffmpeg command line.");
}
var lastAnalyzeUpdate = 0L;
var groups = await Task.Run(() => VideoOcrFrameGrouper.Group(
frameFileNames,
BrightnessMinimum,
Se.Settings.Video.VideoOcr.ImageSimilarityPercent,
(current, total) =>
{
var now = Environment.TickCount64;
if (now - lastAnalyzeUpdate > 200 || current == total)
{
lastAnalyzeUpdate = now;
Dispatcher.UIThread.Post(() =>
{
ProgressText = string.Format(Se.Language.Video.VideoOcr.AnalyzingFramesXY, current, total);
ProgressValue = total == 0 ? 0 : current * 100.0 / total;
});View on GitHub (pinned to 17a9f07487)
Solutions
- Read the tools log for the ExtractFrames ffmpeg command and run it manually to capture stderr.
- Verify the source opens in ffprobe and is a real video stream (not audio-only).
- Ensure ffmpeg is installed/runnable and the temp folder has free disk space.
- Confirm the extraction fps/range settings produce frames (e.g. FramesPerStep > 0, in-range start/end).
Example fix
// before
await ExtractFrames(framesFolder, cancellationToken);
var frameFileNames = Directory.GetFiles(framesFolder, "*.jpg").OrderBy(p => p, StringComparer.Ordinal).ToList();
if (frameFileNames.Count == 0)
throw new Exception("No frames were extracted from the video - see log for the ffmpeg command line.");
// after - validate the source is decodable first, name ffmpeg's failure
if (!await FfmpeWrapper.CanDecode(_videoFileName))
throw new Exception("Source video could not be decoded by ffmpeg - see log.");
await ExtractFrames(framesFolder, cancellationToken);
var frameFileNames = Directory.GetFiles(framesFolder, "*.jpg").OrderBy(p => p, StringComparer.Ordinal).ToList();
if (frameFileNames.Count == 0)
throw new Exception($"No frames were extracted (ffmpeg exit {_ffmpegExitCode}) - see log for the command line."); Defensive patterns
Strategy: validation
Validate before calling
if (string.IsNullOrEmpty(_videoFileName) || VideoWidth <= 0) return;
if (!await FfmpegWrapper.CanDecode(_videoFileName))
throw new Exception("Source video cannot be decoded by ffmpeg."); Try / catch
try
{
await ExtractFrames(framesFolder, cancellationToken);
var frameFileNames = Directory.GetFiles(framesFolder, "*.jpg");
if (frameFileNames.Length == 0) throw new Exception("No frames extracted - see log.");
}
catch (Exception ex) { SeLogger.Error(ex, "Video OCR extraction failed"); /* show message */ } Prevention
- ffprobe the source to confirm it has a decodable video stream before OCR.
- Ensure temp disk space for the extracted frames.
- Log the ffmpeg command line and exit code on failure.
When it happens
Trigger: ffmpeg batch extraction failed or wrote no JPGs: corrupt/unsupported source, an invalid extraction range/fps, ffmpeg not found, the temp frames folder was cleaned mid-run, or a crop/scale filter rejected by ffmpeg.
Common situations: Corrupt source video; ffmpeg missing from PATH/tools folder; user pointed OCR at an audio-only or unsupported container; antivirus deleting the extracted frames; disk full in temp.
Related errors
- Could not extract the current frame - see log for the ffmpeg
- Paddle OCR failed: {paddleOcr.Error}
- {Se.Language.Ocr.CrispEmbedNotDownloaded}
- {engine.Error}
- {error}
AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13).
Data as JSON: /api/errors/9d33d0ddcfdc26f7.
Report an issue: GitHub.