{"record":{"id":"f9b9ae9b02377ea1","repo":"Comfy-Org/ComfyUI","slug":"input-video-frame-rate-fps-2f-fps-exceeds-ale","errorCode":null,"errorMessage":"Input video frame rate ({fps:.2f} fps) exceeds Aleph2's maximum of 30 fps.","messagePattern":"Input video frame rate \\((.+?) fps\\) exceeds Aleph2's maximum of 30 fps\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_runway.py","lineNumber":776,"sourceCode":"        prompt: str,\n        video: Input.Video,\n        seed: int,\n        public_figure_threshold: str = \"low\",\n        keyframes: RunwayAleph2KeyframeChain | None = None,\n        prompt_images: RunwayAleph2PromptImageChain | None = None,\n    ) -> IO.NodeOutput:\n        validate_string(prompt, min_length=1, max_length=1000)\n        validate_video_duration(\n            video,\n            min_duration=2.0,\n            max_duration=30.0,\n        )\n        try:\n            fps = float(video.get_frame_rate())\n        except Exception:\n            fps = None\n        if fps is not None and fps > 30.0 + 0.01:\n            raise ValueError(f\"Input video frame rate ({fps:.2f} fps) exceeds Aleph2's maximum of 30 fps.\")\n\n        if (keyframes and keyframes.items) and (prompt_images and prompt_images.items):\n            raise ValueError(\"Aleph2 accepts either keyframes or prompt images, not both.\")\n\n        video_duration: float | None = None\n        try:\n            video_duration = video.get_duration()\n        except Exception:\n            video_duration = None\n\n        def _check_seconds(value: float, label: str) -> None:\n            if video_duration is not None and value > video_duration + 0.0001:\n                raise ValueError(f\"{label} {value:.2f}s exceeds the input video duration ({video_duration:.2f}s).\")\n\n        video_url = await upload_video_to_comfyapi(cls, video)\n\n        keyframe_models: list[RunwayAleph2KeyframeSeconds | RunwayAleph2KeyframeAt] = []\n        if keyframes is not None:","sourceCodeStart":758,"sourceCodeEnd":794,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_runway.py#L758-L794","documentation":"Raised by the Runway Aleph2 video-to-video node when the input video's frame rate, read via video.get_frame_rate(), exceeds 30 fps (with a 0.01 tolerance). If the frame rate cannot be read the check is skipped, so it only fires when fps is determinable and above the limit. It fires before any upload happens.","triggerScenarios":"Passing a video with fps > 30.01 (e.g. 60 fps gameplay/screen capture, 50 fps PAL footage) to the Aleph2 node; video.get_frame_rate() must succeed for the check to run.","commonSituations":"Feeding 60fps phone footage or high-framerate screen recordings; mixing 60fps sources into a workflow built for cinematic 24/30fps material.","solutions":["Re-encode or resample the video to 30 fps or lower before the node (e.g. ffmpeg -r 30)","Use a video frame-rate conversion node upstream in the workflow","If the source is genuinely high-fps, decimate frames rather than duplicating to keep duration correct"],"exampleFix":"# before\nvideo_60fps = load_video(\"clip.mp4\")  # 60 fps\naleph2(prompt, video_60fps, ...)\n\n# after\n# shell: ffmpeg -i clip.mp4 -r 30 clip_30fps.mp4\nvideo_30fps = load_video(\"clip_30fps.mp4\")\naleph2(prompt, video_30fps, ...)","handlingStrategy":"validation","validationCode":"try:\n    fps = float(video.get_frame_rate())\nexcept Exception:\n    fps = None\nif fps is not None and fps > 30.01:\n    raise ValueError(f\"Resample {fps:.2f} fps video to <=30 fps before Aleph2\")","typeGuard":"def is_aleph2_safe_fps(video) -> bool:\n    try:\n        return float(video.get_frame_rate()) <= 30.01\n    except Exception:\n        return True  # check is skipped when fps is unreadable","tryCatchPattern":"try:\n    await aleph2_execute(...)\nexcept ValueError as e:\n    if \"frame rate\" in str(e):\n        video = reencode_at_30fps(video)  # then retry\n    else:\n        raise","preventionTips":["Standardize inputs to 24/30 fps for Runway video nodes","Check fps with ffprobe before wiring external footage","Remember the check is skipped when fps is unreadable — do not rely on missing metadata"],"tags":["runway","aleph2","video","fps","validation"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}