{"record":{"id":"6659e6ff703972b4","repo":"remotion-dev/remotion","slug":"unsupported-track-type-strh-fcctype","errorCode":null,"errorMessage":"Unsupported track type ${strh.fccType}","messagePattern":"Unsupported track type (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/media-parser/src/containers/riff/get-tracks-from-avi.ts","lineNumber":136,"sourceCode":"\tfor (const box of boxes) {\n\t\tconst strh = getStrhBox(box.children);\n\t\tif (!strh) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst {strf} = strh;\n\n\t\tif (strf.type === 'strf-box-video') {\n\t\t\ttracks.push(\n\t\t\t\taddAvcProfileToTrack(\n\t\t\t\t\tmakeAviVideoTrack({strh, strf, index: i}),\n\t\t\t\t\tstate.riff.getAvcProfile(),\n\t\t\t\t),\n\t\t\t);\n\t\t} else if (strh.fccType === 'auds') {\n\t\t\ttracks.push(makeAviAudioTrack({strf, index: i}));\n\t\t} else {\n\t\t\tthrow new Error(`Unsupported track type ${strh.fccType}`);\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn tracks;\n};\n\nexport const hasAllTracksFromAvi = (state: ParserState): boolean => {\n\ttry {\n\t\tconst structure = state.structure.getRiffStructure();\n\t\tconst numberOfTracks = getNumberOfTracks(structure);\n\t\tconst tracks = getTracksFromAvi(structure, state);\n\t\treturn (\n\t\t\ttracks.length === numberOfTracks &&\n\t\t\t!tracks.find(\n\t\t\t\t(t) => t.type === 'video' && t.codec === TO_BE_OVERRIDDEN_LATER,\n\t\t\t)","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/media-parser/src/containers/riff/get-tracks-from-avi.ts#L118-L154","documentation":"Thrown in getTracksFromAvi() after a stream is checked: the parser handles video streams (strf.type === 'strf-box-video') and audio streams (fccType === 'auds'). Any other RIFF stream type — 'txts' (text/subtitles), 'mids' (MIDI), 'ibus' (ibus), 'jpeg', etc. — reaches the else branch and throws.","triggerScenarios":"An AVI containing a non-audio/non-video stream: embedded subtitles, MIDI, custom data streams, or vendor extension chunks mistakenly typed as a stream.","commonSituations":"AVIs with embedded subtitle streams (common in fansub/dual-audio releases); AVIs with attached chapter/text data; AVIs produced by capture tools that write auxiliary streams.","solutions":["Remux the AVI and drop non-AV streams: ffmpeg -i in.avi -map 0:v -map 0:a -c copy out.avi","Transcode to a cleaner container: ffmpeg -i in.avi -map 0:v -map 0:a -c:v libx264 -c:a aac out.mp4 (MP4 is better supported).","Pre-scan streams with ffprobe and reject AVIs that contain auxiliary stream types."],"exampleFix":"// before\nawait parseMediaStream({src: 'multistream.avi'}); // has txts stream\n\n// after: drop non-AV streams\n// ffmpeg -i multistream.avi -map 0:v -map 0:a -c copy out.avi\nawait parseMediaStream({src: 'out.avi'});","handlingStrategy":"validation","validationCode":"// Pre-check with ffprobe that only video/audio streams exist in the AVI.\n// ffprobe -v error -show_entries stream=codec_type -of csv in.avi\n// Expect only 'video' and 'audio' lines.","typeGuard":"type SupportedAviFccType = 'vids' | 'auds';\nfunction isSupportedAviStreamType(t: string): t is SupportedAviFccType {\n  return t === 'vids' || t === 'auds';\n}","tryCatchPattern":"try {\n  await parseMediaStream({src: 'in.avi'});\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Unsupported track type')) {\n    // remux dropping non-AV streams: ffmpeg -i in.avi -map 0:v -map 0:a -c copy out.avi\n  } else throw err;\n}","preventionTips":["Strip subtitle/data streams from AVIs before parsing.","Prefer remuxing to MP4 which handles auxiliary streams differently.","Inspect codec_type list with ffprobe before parsing."],"tags":["riff","avi","stream-type","subtitles","unsupported-format","media-parser"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}