{"record":{"id":"9872d4eaa2ad6a00","repo":"remotion-dev/remotion","slug":"live-streams-are-not-currently-supported-by-remoti","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/components/use-probe.ts","lineNumber":71,"sourceCode":"\t\t\tsource:\n\t\t\t\tsrc.type === 'file' ? new BlobSource(src.file) : new UrlSource(src.url),\n\t\t});\n\t}, [src]);\n\n\tconst getStart = useCallback(() => {\n\t\tconst run = async () => {\n\t\t\tinput.getFormat().then((format) => setContainer(format));\n\t\t\tinput.source.getSize().then((s) => setSize(s));\n\t\t\tgetVideoFrameRate(input).then(setFrameRate);\n\t\t\tgetDurationOrCompute(input).then((duration) =>\n\t\t\t\tsetDurationInSeconds(duration),\n\t\t\t);\n\t\t\tinput.getMetadataTags().then((tags) => setMetadata(tags));\n\n\t\t\tconst trx = await input.getTracks();\n\t\t\tfor (const track of trx) {\n\t\t\t\tif (await track.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 track.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\t\t\t}\n\n\t\t\tlet hasAudioTrack = false;\n\t\t\tlet hasVideoTrack = false;\n\t\t\tfor (const track of trx) {\n\t\t\t\tif (track.isVideoTrack()) {\n\t\t\t\t\thasVideoTrack = true;\n\t\t\t\t\tconst codec = await track.getCodec();\n\t\t\t\t\tsetVideoCodec(codec);","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/convert/app/components/use-probe.ts#L53-L89","documentation":"Thrown by use-probe when any input track reports isLive() === true. Remotion Convert (and Remotion's render pipeline) requires finite, seekable media; live streams have no determinable duration and cannot be seeked, so probing aborts.","triggerScenarios":"Loading an HLS/DASH/RTMP/SRT live source, or any track whose container signals a live broadcast flag. The probe iterates every track and throws on the first live one.","commonSituations":"Pointing the Convert UI at a live stream URL; using an HLS playlist with `#EXT-X-PLAYLIST-TYPE:EVENT`/no ENDLIST that mediabunny classifies as live; accidentally capturing an m3u8 from a live encoder.","solutions":["Provide a finite, on-demand media file instead of a live stream.","If the source is recorded-but-flagged-live, remux to set a finite duration and remove the live flag.","Gate the input in the UI: reject URLs whose tracks report isLive() before initiating conversion."],"exampleFix":"// before\nconst tracks = await input.getTracks();\nfor (const t of tracks) { /* throws if live */ }\n\n// after\nconst tracks = await input.getTracks();\nif (await Promise.any(tracks.map((t) => t.isLive()))) {\n  showError('Live streams are not supported. Upload a file instead.');\n  return;\n}","handlingStrategy":"validation","validationCode":"const tracks = await input.getTracks();\nconst liveFlags = await Promise.all(tracks.map((t) => t.isLive()));\nif (liveFlags.some(Boolean)) {\n  showError('Live streams are not supported. Please upload a file.');\n  return;\n}","typeGuard":"null","tryCatchPattern":"try { await probe(input); }\ncatch (e) {\n  if (e.message.includes('Live streams')) showError('Use a finite media file instead.');\n  else throw e;\n}","preventionTips":["Reject live URLs at the input boundary.","Remux live-flagged-but-recorded sources to clear the flag.","Inform users that Remotion requires finite, seekable media."],"tags":["typescript","convert","live-stream","media","unsupported-input"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}