{"record":{"id":"b184fb39e7ba7273","repo":"remotion-dev/remotion","slug":"live-streams-are-not-currently-supported-by-remoti-b184fb","errorCode":null,"errorMessage":"Live streams are not currently supported by Remotion. Sorry!","messagePattern":"Live streams are not currently supported by Remotion\\. Sorry!","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/convert/app/lib/use-thumbnail.ts","lineNumber":36,"sourceCode":"\n\tconst waveform = useMemo(() => {\n\t\treturn makeWaveformVisualizer({\n\t\t\tonWaveformBars,\n\t\t});\n\t}, [onWaveformBars]);\n\n\tconst execute = useCallback(() => {\n\t\tconst getDuration = async () => {\n\t\t\tconst duration = await input.computeDuration();\n\t\t\twaveform.setDuration(duration);\n\t\t};\n\n\t\tconst setVideoTrack = async () => {\n\t\t\tconst videoTrack = await input.getPrimaryVideoTrack();\n\n\t\t\tif (videoTrack) {\n\t\t\t\tif (await videoTrack.isLive()) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'Live streams are not currently supported by Remotion. Sorry!',\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (await videoTrack.isRelativeToUnixEpoch()) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'Streams with UNIX timestamps are not currently supported by Remotion. Sorry!',\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst videoSink = new VideoSampleSink(videoTrack);\n\t\t\t\tlet samples = 0;\n\t\t\t\tconst iterator = videoSink.samples();\n\t\t\t\tfor await (const sample of iterator) {\n\t\t\t\t\tsamples++;\n\t\t\t\t\tonVideoThumbnail(sample.toVideoFrame());\n\t\t\t\t\tsample.close();\n","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/convert/app/lib/use-thumbnail.ts#L18-L54","documentation":"Thrown by use-thumbnail's setVideoTrack when the primary video track reports isLive() === true. Thumbnail generation requires seeking/sampling discrete frames, which live streams do not support, so the hook refuses to proceed.","triggerScenarios":"Loading a live HLS/DASH/RTMP source into the Convert UI; any input whose primary video track carries a live broadcast flag. Same root cause as error 190 but specifically in the thumbnail-generation path.","commonSituations":"Pasting a live m3u8/mpd URL; recorded-but-live-flagged HLS playlists; surveillance/IPC streams.","solutions":["Provide a finite, on-demand media file for thumbnail generation.","Remux the source to clear the live flag and establish a finite duration.","Check isLive() before invoking the thumbnail hook and skip thumbnails for live inputs."],"exampleFix":"// before\nconst videoTrack = await input.getPrimaryVideoTrack();\nif (videoTrack && await videoTrack.isLive()) throw ...;\n\n// after\nconst videoTrack = await input.getPrimaryVideoTrack();\nif (videoTrack && await videoTrack.isLive()) {\n  setThumbnailsEnabled(false); // gracefully disable\n  return;\n}","handlingStrategy":"validation","validationCode":"const videoTrack = await input.getPrimaryVideoTrack();\nif (videoTrack && await videoTrack.isLive()) {\n  setThumbnailsEnabled(false);\n  return;\n}","typeGuard":"null","tryCatchPattern":"try { await setVideoTrack(); }\ncatch (e) {\n  if (e.message.includes('Live streams')) { setThumbnailsEnabled(false); }\n  else throw e;\n}","preventionTips":["Reject live inputs for thumbnail generation.","Clear live flags via remux for recorded-but-flagged sources.","Gracefully disable thumbnails instead of crashing."],"tags":["typescript","convert","thumbnail","live-stream","unsupported-input"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}