SubtitleEdit/subtitleedit · error · InvalidOperationException

No VobSub subtitle packets found in the input VOB(s). DVD au

Error message

No VobSub subtitle packets found in the input VOB(s). DVD audio-only chunks (VTS_xx_0.VOB) carry no subtitles — subtitles live in VTS_xx_1.VOB and later.

What it means

Thrown by VobSubExtractor.Extract after parsing every supplied VOB produced zero VobSubMergedPacks. The most common cause named in the message: the supplied file is the DVD's audio-only menu chunk (VTS_xx_0.VOB), which carries no subpictures. Subtitles live in VTS_xx_1.VOB and later.

Source

Thrown at src/seconv/Core/VobSubExtractor.cs:63

            // here and the .idx ends up at the wrong path (e.g. movie → "vie"+"idx"
            // = "vieidx"). Caller normalises, but assert just in case.
            throw new ArgumentException("subOutputPath must end in '.sub'", nameof(subOutputPath));
        }

        // Parse every VOB into per-stream merged packs. DVDs assign continuous PTS
        // across VOB chunks of the same title, so packs from later VOBs naturally
        // land after earlier ones in playback time.
        var allPacks = new List<VobSubMergedPack>();
        foreach (var vob in vobFiles)
        {
            var parser = new VobSubParser(isPal);
            parser.Open(vob);
            allPacks.AddRange(parser.MergeVobSubPacks());
        }

        if (allPacks.Count == 0)
        {
            throw new InvalidOperationException(
                "No VobSub subtitle packets found in the input VOB(s). "
                + "DVD audio-only chunks (VTS_xx_0.VOB) carry no subtitles — subtitles live in VTS_xx_1.VOB and later.");
        }

        // Group by DVD subpicture stream ID (one stream ≙ one subtitle language).
        // Sorting by Key keeps the per-stream output indices stable across reruns.
        var streams = allPacks
            .GroupBy(p => p.StreamId)
            .OrderBy(g => g.Key)
            .ToList();

        var outputs = new List<StreamOutput>(streams.Count);
        for (var i = 0; i < streams.Count; i++)
        {
            var streamId = streams[i].Key;
            var streamPacks = streams[i].OrderBy(p => p.StartTime.Ticks).ToList();

            var outputPath = streams.Count == 1

View on GitHub (pinned to 17a9f07487)

Solutions

  1. Supply VTS_xx_1.VOB through VTS_xx_n.VOB for the title (the subtitle-bearing chunks), not VTS_xx_0.VOB.
  2. If you only have a single concatenated VOB, make sure it is the movie title, not the menu.
  3. Verify with a tool like `vobsub2srt`/`mkvextract`/`lsdvd` that the title actually has subtitle streams; re-rip if stripped.

Example fix

// before
seconv VTS_01_0.VOB vobsub ...     // audio/menu chunk
// after
seconv VTS_01_1.VOB VTS_01_2.VOB vobsub ...
Defensive patterns

Strategy: validation

Validate before calling

// Quick pre-check: warn the user if they only passed VTS_xx_0.VOB
if (vobFiles.All(f => Regex.IsMatch(Path.GetFileName(f), @"VTS_[0-9]+_[0-9]0.VOB", RegexOptions.IgnoreCase)))
    warnings.Add("Only VTS_xx_0.VOB supplied — these are audio/menu chunks. Use VTS_xx_1.VOB and later.");

Type guard

null

Try / catch

null

Prevention

When it happens

Trigger: All supplied VOBs were parsed by VobSubParser/MergeVobSubPacks and allPacks.Count == 0.

Common situations: User pointed the extractor at VTS_01_0.VOB (menu/audio) instead of VTS_01_1.VOB..VTS_01_n.VOB; the VOB is from a title with no subtitles; corrupt/incomplete rip with the subtitle stream stripped.

Related errors


AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13). Data as JSON: /api/errors/ebba712ec2b0fcc8. Report an issue: GitHub.