{"record":{"id":"1a23e76231bcae8e","repo":"remotion-dev/remotion","slug":"live-streams-are-not-currently-supported-by-remoti-1a23e7","errorCode":null,"errorMessage":"Live streams are not currently supported by Remotion. Sorry! Source: ${src}","messagePattern":"Live streams are not currently supported by Remotion\\. Sorry! Source: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/media/src/video-extraction/get-frames-since-keyframe.ts","lineNumber":98,"sourceCode":"\t\tconst format = await getFormatOrNullOrNetworkError(input);\n\t\tconst isMatroska = format === MATROSKA || format === WEBM;\n\n\t\tconst getVideoSinks = async (): Promise<VideoSinkResult> => {\n\t\t\tif (format === 'network-error') {\n\t\t\t\treturn 'network-error';\n\t\t\t}\n\n\t\t\tif (format === null) {\n\t\t\t\treturn 'unknown-container-format';\n\t\t\t}\n\n\t\t\tconst videoTrack = await input.getPrimaryVideoTrack();\n\t\t\tif (!videoTrack) {\n\t\t\t\treturn 'no-video-track';\n\t\t\t}\n\n\t\t\tif (await videoTrack.isLive()) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Live streams are not currently supported by Remotion. Sorry! Source: ' +\n\t\t\t\t\t\tsrc,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (await videoTrack.isRelativeToUnixEpoch()) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Streams with UNIX timestamps are not currently supported by Remotion. Sorry! Source: ' +\n\t\t\t\t\t\tsrc,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst canDecode = await videoTrack.canDecode();\n\n\t\t\tif (!canDecode) {\n\t\t\t\tif (videoTrack.codec === 'prores') {\n\t\t\t\t\treturn 'cannot-decode-prores';\n\t\t\t\t}","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/media/src/video-extraction/get-frames-since-keyframe.ts#L80-L116","documentation":"Thrown by getFramesSinceKeyframe in @remotion/media when the primary video track of a source reports itself as a live stream. This helper decodes frames relative to the last keyframe and needs a finite, seekable file; live streams cannot be seeked arbitrarily. Fires at get-frames-since-keyframe.ts:98.","triggerScenarios":"An <OffthreadVideo>/<Video> source whose parsed video track reports live (HLS live playlist, DASH live, ongoing segment stream). videoTrack.isLive() resolves true during keyframe-relative frame extraction.","commonSituations":"Feeding a live broadcast URL, webcam feed, or HLS playlist marked LIVE. This path is the offthread/video-extraction pipeline, so it fires during rendering or offthread frame extraction specifically.","solutions":["Use a finite recorded file (MP4/WebM) or a complete VOD HLS playlist.","Record the live stream to a file and reference that file instead.","Ensure any HLS playlist is a complete VOD playlist (has EXT-X-ENDLIST)."],"exampleFix":"// before\n<OffthreadVideo src={'https://example.com/live/index.m3u8'} />\n\n// after\n<OffthreadVideo src={staticFile('recorded.mp4')} />","handlingStrategy":"validation","validationCode":"null","typeGuard":null,"tryCatchPattern":"// Validate source is a finite file before use; no runtime recovery.\ntry {\n  return <OffthreadVideo src={src} />;\n} catch (e) {\n  if (e instanceof Error && e.message.includes('Live streams')) {\n    return <OffthreadVideo src={staticFile('fallback.mp4')} />;\n  }\n  throw e;\n}","preventionTips":["Disallow live/HLS sources for offthread video rendering.","Validate sources are finite files before passing to <OffthreadVideo>.","Use VOD playlists or recorded files exclusively."],"tags":["video","live-stream","hls","offthread-video","media"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}