{"record":{"id":"a8060ea35a1c85fe","repo":"remotion-dev/remotion","slug":"you-have-passed-a-playbackrate-of-props-playback","errorCode":null,"errorMessage":"You have passed a playbackRate of ${props.playbackRate} to your <${component} /> component. Playback rate must be a real number above 0.","messagePattern":"You have passed a playbackRate of (.+?) to your <(.+?) /> component\\. Playback rate must be a real number above 0\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/core/src/validate-media-props.ts","lineNumber":42,"sourceCode":"\t\t);\n\t}\n\n\tif (\n\t\ttypeof props.playbackRate !== 'number' &&\n\t\ttypeof props.playbackRate !== 'undefined'\n\t) {\n\t\tthrow new TypeError(\n\t\t\t`You have passed a playbackRate of type ${typeof props.playbackRate} to your <${component} /> component. Playback rate must a real number or undefined.`,\n\t\t);\n\t}\n\n\tif (\n\t\ttypeof props.playbackRate === 'number' &&\n\t\t(isNaN(props.playbackRate) ||\n\t\t\t!Number.isFinite(props.playbackRate) ||\n\t\t\tprops.playbackRate <= 0)\n\t) {\n\t\tthrow new TypeError(\n\t\t\t`You have passed a playbackRate of ${props.playbackRate} to your <${component} /> component. Playback rate must be a real number above 0.`,\n\t\t);\n\t}\n\n\tif (\n\t\ttypeof props.preservePitch !== 'boolean' &&\n\t\ttypeof props.preservePitch !== 'undefined'\n\t) {\n\t\tthrow new TypeError(\n\t\t\t`'preservePitch' must be a boolean or undefined but got '${typeof props.preservePitch}' instead`,\n\t\t);\n\t}\n};\n","sourceCodeStart":24,"sourceCodeEnd":56,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/core/src/validate-media-props.ts#L24-L56","documentation":"validateMediaProps throws a TypeError when playbackRate is a number but is NaN, not finite, or <= 0. Remotion requires a positive real playback rate (e.g. 0.5, 1, 2); zero, negative, NaN, and Infinity are rejected because they break media timing.","triggerScenarios":"Passing playbackRate=0; negative rates; NaN from failed parses; Infinity from division by zero; rates computed from optional fields that resolved to 0 or NaN.","commonSituations":"Defaulting rate to 0; division by zero in rate math; parseFloat failures; config with rate=0; sign errors producing negative rates.","solutions":["Default to a valid positive rate: `playbackRate={rate || 1}`.","Guard against non-finite: `Number.isFinite(rate) && rate > 0 ? rate : 1`.","Fix upstream math that produces 0/NaN/Infinity.","Validate the source value before passing."],"exampleFix":"// before\n<Video src={url} playbackRate={speed} /> // speed is 0 or NaN\n\n// after\nconst safeRate = Number.isFinite(speed) && speed > 0 ? speed : 1;\n<Video src={url} playbackRate={safeRate} />","handlingStrategy":"validation","validationCode":"const safeRate = Number.isFinite(rate) && rate > 0 ? rate : 1;\n// then pass safeRate","typeGuard":"const isPositiveFiniteRate = (r: unknown): r is number =>\n  typeof r === 'number' && Number.isFinite(r) && r > 0;","tryCatchPattern":null,"preventionTips":["Default playbackRate to 1 when the computed value is invalid.","Guard divisions producing 0/Infinity/NaN.","Validate config values for positive finite numbers."],"tags":["remotion","audio","video","playback-rate","validation","typeerror","bounds","nan"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}