{"record":{"id":"92c39ae15f90483d","repo":"Comfy-Org/ComfyUI","slug":"sync-so-rejects-videos-above-4k-4096x2160-got","errorCode":null,"errorMessage":"sync.so rejects videos above 4K (4096x2160); got {width}x{height}. Downscale the video first.","messagePattern":"sync\\.so rejects videos above 4K \\(4096x2160\\); got (.+?)x(.+?)\\. Downscale the video first\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_sync_so.py","lineNumber":150,"sourceCode":"            price_badge=IO.PriceBadge(\n                expr=\"\"\"{\"type\":\"usd\",\"usd\":0.19019,\"format\":{\"approximate\":true,\"suffix\":\"/second\"}}\"\"\",\n            ),\n        )\n\n    @classmethod\n    async def execute(\n        cls,\n        video: Input.Video,\n        audio: Input.Audio,\n        seed: int,\n        model: dict,\n    ) -> IO.NodeOutput:\n        try:\n            width, height = video.get_dimensions()\n        except Exception:\n            width = height = None\n        if width and height and (max(width, height) > 4096 or width * height > 4096 * 2160):\n            raise ValueError(\n                f\"sync.so rejects videos above 4K (4096x2160); got {width}x{height}. Downscale the video first.\"\n            )\n        validate_audio_duration(audio, max_duration=600)\n\n        if model[\"speaker_selection\"] == \"auto-detect\":\n            speaker_detection = SyncActiveSpeakerDetection(auto_detect=True)\n        elif model[\"speaker_selection\"] == \"coordinates\":\n            speaker_detection = SyncActiveSpeakerDetection(\n                frame_number=model[\"speaker_frame\"],\n                coordinates=[model[\"speaker_x\"], model[\"speaker_y\"]],\n            )\n        else:\n            speaker_detection = None\n\n        video_url = await upload_video_to_comfyapi(cls, video, max_duration=600)\n        audio_url = await upload_audio_to_comfyapi(cls, audio)\n\n        generation = await sync_op(","sourceCodeStart":132,"sourceCodeEnd":168,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_sync_so.py#L132-L168","documentation":"Raised by the sync.so lipsync node when the input video's dimensions exceed the service's 4K cap: either the longer side is over 4096px or total pixels exceed 4096*2160. Dimensions come from video.get_dimensions(); if that raises, the check is skipped. It fires before audio validation and the generation request.","triggerScenarios":"Passing a video wider/taller than 4096 on the long side or with more than ~8.8MP total (e.g. 4096x2160+ or a huge square render) to the sync.so lipsync node.","commonSituations":"Using uncompressed 4K/6K camera originals or high-res renders directly; assuming the service downscales server-side (unlike the talking-image node, this video node has no auto_downscale).","solutions":["Downscale the video to at most 4096 on the long side and 4096x2160 total pixels before the node (ffmpeg -vf scale)","Use a video resize node upstream in the workflow","Keep the aspect ratio when downscaling to avoid a second rejection on pixel count"],"exampleFix":"# before\nsync_lipsync(video=video_6k, audio=a)\n\n# after\n# shell: ffmpeg -i in.mp4 -vf \"scale='min(4096,iw)':-2\" out.mp4\nsync_lipsync(video=video_4k, audio=a)","handlingStrategy":"validation","validationCode":"try:\n    w, h = video.get_dimensions()\nexcept Exception:\n    w = h = None\nif w and h and (max(w, h) > 4096 or w * h > 4096 * 2160):\n    raise ValueError(f\"Downscale {w}x{h} video to <=4096 long side / <=4096x2160 pixels\")","typeGuard":"def is_syncso_safe_video(video) -> bool:\n    try:\n        w, h = video.get_dimensions()\n    except Exception:\n        return True\n    return max(w, h) <= 4096 and w * h <= 4096 * 2160","tryCatchPattern":"try:\n    await syncso_lipsync(video, audio)\nexcept ValueError as e:\n    if \"above 4K\" in str(e):\n        video = downscale_video(video)  # then retry\n        await syncso_lipsync(video, audio)\n    else:\n        raise","preventionTips":["Pre-scale footage to <=4K in the ingest step, not at the API node","The video lipsync node has no auto-downscale — unlike the talking-image node","Check both constraints: long side <=4096 AND total pixels <=4096*2160"],"tags":["sync-so","video","resolution","validation","lipsync"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}