{"record":{"id":"2b8d562ab8837e27","repo":"remotion-dev/remotion","slug":"live-streams-are-not-currently-supported-by-remoti-2b8d56","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":"Error","httpStatus":null,"severity":"error","filePath":"packages/media-utils/src/use-windowed-audio-data.ts","lineNumber":137,"sourceCode":"\t\t\t});\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tinput.dispose();\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', onAbort, {once: true});\n\n\t\t\ttry {\n\t\t\t\tconst durationInSeconds = await input.computeDuration();\n\n\t\t\t\tconst audioTrack = await input.getPrimaryAudioTrack();\n\n\t\t\t\tif (!audioTrack) {\n\t\t\t\t\tthrow new Error('No audio track found');\n\t\t\t\t}\n\n\t\t\t\tif (await audioTrack.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! Source: ' +\n\t\t\t\t\t\t\tsrc,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (await audioTrack.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! Source: ' +\n\t\t\t\t\t\t\tsrc,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst canDecode = await audioTrack.canDecode();\n\n\t\t\t\tif (!canDecode) {\n\t\t\t\t\tthrow new Error('Audio track cannot be decoded');\n\t\t\t\t}\n","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/media-utils/src/use-windowed-audio-data.ts#L119-L155","documentation":"Thrown inside useWindowedAudioData() when mediabunny reports the source is a live stream (audioTrack.isLive() === true, line 136-141). Remotion needs deterministic, finite media to schedule frames, so live sources (HLS/DASH live, RTMP relays, radio streams) are rejected up front. The error includes the offending src and is forwarded through cancelRender().","triggerScenarios":"Passing an HLS .m3u8 of a live event, an RTMP/RTSP radio relay URL, a DASH live manifest, a YouTube/Twitch stream URL, or any source whose container advertises LIVE.","commonSituations":"Mistakenly using a live endpoint (e.g. radio station stream) instead of a recorded VOD; using the live variant of an HLS playlist instead of the VOD/Event playlist; pulling a 'watch?v=' URL instead of a downloadable media URL; radio/podcast services that stream in real time.","solutions":["Use a finite, recorded version of the media (VOD HLS playlist, downloadable MP4/MP3, downloaded file) instead of the live source.","If you must react to live audio in a browser UI (not a Remotion render), do not use useWindowedAudioData; use a plain Web Audio analyser in client React.","For HLS, switch from TYPE=LIVE to TYPE=VOD or TYPE=EVENT playlists, or render a segment list to a static file first.","Download the live stream offline (e.g. streamlink/ffmpeg) to a finite file and point the hook at that file."],"exampleFix":"// before (live radio stream -> rejected)\nuseWindowedAudioData({src: 'https://radio.example/live.m3u8', ...});\n\n// after (record first, then render from the finite file)\n// offline: streamlink --output radio.mp3 https://radio.example/live best\nuseWindowedAudioData({src: staticFile('radio.mp3'), ...});","handlingStrategy":"validation","validationCode":"// Reject obvious live-stream URLs before handing them to the hook\nfunction looksLikeLiveStream(src: string): boolean {\n  const s = src.toLowerCase();\n  return /(?:^|\\/)live[._/-]/.test(s)\n    || s.endsWith('.m3u8') && !s.includes('vod')\n    || /^rtmp:|^rtsp:|^udp:/.test(s);\n}\n\nif (looksLikeLiveStream(src)) {\n  throw new Error(`Use a recorded/VOD source for Remotion; ${src} appears to be live.`);\n}","typeGuard":"async function isLiveMediabunny(src: string): Promise<boolean> {\n  const {Input} = await import('mediabunny');\n  const input = new Input({source: src});\n  try {\n    const track = await input.getPrimaryAudioTrack();\n    return track ? await track.isLive() : false;\n  } finally {\n    input.dispose();\n  }\n}","tryCatchPattern":"// Forwarded to cancelRender(); use an ErrorBoundary to fall back to a non-live asset:\n// <ErrorBoundary fallback={<Waveform src={staticFile('fallback.mp3')} ... />}>\n//   <WindowedWaveform src={liveUrl} ... />\n// </ErrorBoundary>","preventionTips":["Use VOD or recorded media (downloadable MP4/MP3, VOD HLS) instead of live sources for Remotion.","For HLS, pick a TYPE=VOD or TYPE=EVENT playlist rather than TYPE=LIVE.","Record live audio to a finite file with streamlink/ffmpeg before rendering.","Avoid passing user-facing streaming service watch URLs to useWindowedAudioData."],"tags":["audio","live-stream","unsupported-format","mediabunny","render-failure"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}