mpegcat dumps detailed textual information about an MPEG2 file. It also has an option for writing out a particular Packetized Elementary Stream (PES) given its id.
The original purpose of mpegcat was for debugging stream parsing issues in the gopchop cuts-only MPEG2 video editor, but it has more general utility.
-d,--debugReport debug info
-D,--dvd-formatEnable DVD packet extensions
-h,-?,--helpHelp
-w,--write FILE,0xID[,0xSID]Write PES with id ID (and subid SID) to FILE. Sub Picture Unit (SPU) streams such as overlays, subtitles and DVD menus extracted using this option can be displayed using the companion gtkspu utility.
To find SPU streams in a .VOB ripped from a DVD:
$ mpegcat -iDa VTS_01_0.VOB | grep SPU
131086: 0xBD: DVD Audio 0x20 (SPU 0): 2028 bytes (next marker @ 133120)
133134: 0xBD: DVD Audio 0x20 (SPU 0): 2028 bytes (next marker @ 135168)
137230: 0xBD: DVD Audio 0x20 (SPU 0): 190 bytes (next marker @ 137426)
...
To save a given stream:
$ mpegcat -iDaw dump.spu,0xBD,0x20 VTS_01_0.VOB > /dev/null
(And to view the stream)
$ gtkspu dump.spu 1
$ gtkspu dump.spu 2
$ gtkspu dump.spu 3
...
-p,--packToggle Pack packet start display
-v,--videoToggle video ES packet start display
-a,--audioToggle audio ES packet start display
-o,--otherToggle other stream display (only show video & audio)
-y,--systemToggle system header display
-e,--errorsToggle packet errors
-i,--invertInvert all display toggles