Sora Batch Video Generator
Ten image-to-video jobs at once, merged into one clip
- image_batch
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- image_10
- merged_video
- merged_filename
- video_1
- filename_1
- video_2
- filename_2
- video_3
- filename_3
- video_4
- filename_4
- video_5
- filename_5
- video_6
- filename_6
- video_7
- filename_7
- video_8
- filename_8
- video_9
- filename_9
- video_10
- filename_10
- report
SoraBatchVideo is the pack's fire-hose node: up to ten images, each animated by the Sora reseller API in parallel, then concatenated into a single video. It's built for the "animate every frame of my storyboard" job - the kind of thing that would otherwise mean queueing ten separate image-to-video nodes one at a time and splicing the results yourself. This node runs them concurrently, waits for the slowest, and hands you both the individual clips and the merged cut.
How it works
The core is a ThreadPoolExecutor running max_concurrent API calls in parallel - 3 by default, up to 10. Each input image becomes an image-to-video request (same reseller plumbing as SoraImage2Video, no local model involved), and when all jobs finish the node calls ffmpeg's concat demuxer to join the clips into one file in output_dir. The merged clip is literally a sequence cut: clip 1, then clip 2, and so on. There's no transition smoothing, so keep each clip's look consistent if you want the cut to feel deliberate.
The inputs that matter
Feeding it is the fiddly part, because there are two ways in:
- image_batch - a single IMAGE input where each image in the batch is one job. Cleanest when you have a batch tensor (e.g. from a batch of loaded images).
- image_1 … image_10 + prompt_1 … prompt_10 - ten explicit image/prompt pairs. Use these when the clips need different prompts (say, one camera move per scene).
Shared settings: prompt (the global prompt, e.g. "Animate this image", used when a pair has no specific prompt), max_concurrent, aspect_ratio (16:9, 9:16, 1:1, 4:3), duration (5s/10s/15s), motion_direction, motion_intensity, seed, and output_dir (sora_batch_output by default). Provider and model work as in the rest of the pack - T8 default, sora-2-pro/sora-2/[Aabao] variants on offer.
Outputs: merged_video (VIDEO) + merged_filename, then video_1/filename_1 … video_10/filename_10 for each individual result, plus a report string. The per-clip outputs are gold if you need to re-queue just one scene.
Install
Standard pack install - ComfyUI Manager → search "ComfyUI_Sora", or:
cd ComfyUI/custom_nodes
git clone https://github.com/xuchenxu168/ComfyUI_Sora
cd ComfyUI_Sora && pip install -r requirements.txt
One extra requirement: the merge step shells out to a real ffmpeg binary on your PATH (the pip dependency is ffmpeg-python, a wrapper, not the binary). If merging fails with "未找到ffmpeg", install ffmpeg and make sure it's findable - on Windows that means adding it to PATH.
Common issues
- "未找到ffmpeg,无法合并视频" - the per-clip videos exist but the merge didn't happen. Install ffmpeg, and grab the individual clips from
video_1…10in the meantime. - Cost explosion - ten concurrent 10s jobs is ten paid jobs. Watch
max_concurrentandduration; this node is the fastest way in the pack to spend a day's budget in one Queue press. - Merged clip looks abrupt - concat is a hard cut by design. If you need transitions, generate the clips here, then run them through a proper editor (or the pack's watermark/animation nodes) rather than expecting the merge to smooth anything.
- Some pairs skipped - the
reportoutput lists per-job status; if a provider rejects one image (bad format, unsupported ratio), that job fails while the others complete. Read the report, fix the offender, re-run.
Batch generation is the one place this API-wrapper pack genuinely beats running Sora by hand - parallelism plus one-button concatenation. Just keep an eye on the meter.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| api_provider | COMBO | t8 | 7 options: t8, t8-us, t8-hk, comfly, comfly-us, comfly-hk, +1 |
| api_key | STRING | — | |
| model | COMBO | sora_video2 | 6 options: sora_video2, sora-2-pro, sora-2, [Aabao] sora-2-landscape, [Aabao] sora-2-portrait, [Aabao] sora-2-15s |
| prompt | STRING | Animate this image | — |
| max_concurrent | INT | 31–10 | — |
| aspect_ratio | COMBO | 16:9 | 4 options: 16:9, 9:16, 1:1, 4:3 |
| duration | COMBO | 5s | 3 options: 5s, 10s, 15s |
| image_batchopt | IMAGE | — | |
| prompt_listopt | STRING | — | |
| motion_directionopt | COMBO | auto | 7 options: auto, forward, backward, left, right, zoom_in, +1 |
| motion_intensityopt | FLOAT | 0.500–1 | — |
| seedopt | INT | -1 | — |
| output_diropt | STRING | sora_batch_output | — |
| image_1opt | IMAGE | — | |
| prompt_1opt | STRING | — | |
| image_2opt | IMAGE | — | |
| prompt_2opt | STRING | — | |
| image_3opt | IMAGE | — | |
| prompt_3opt | STRING | — | |
| image_4opt | IMAGE | — | |
| prompt_4opt | STRING | — | |
| image_5opt | IMAGE | — | |
| prompt_5opt | STRING | — | |
| image_6opt | IMAGE | — | |
| prompt_6opt | STRING | — | |
| image_7opt | IMAGE | — | |
| prompt_7opt | STRING | — | |
| image_8opt | IMAGE | — | |
| prompt_8opt | STRING | — | |
| image_9opt | IMAGE | — | |
| prompt_9opt | STRING | — | |
| image_10opt | IMAGE | — | |
| prompt_10opt | STRING | — |
Outputs (23)
| Name | Type | Description |
|---|---|---|
| merged_video | VIDEO | — |
| merged_filename | STRING | — |
| video_1 | VIDEO | — |
| filename_1 | STRING | — |
| video_2 | VIDEO | — |
| filename_2 | STRING | — |
| video_3 | VIDEO | — |
| filename_3 | STRING | — |
| video_4 | VIDEO | — |
| filename_4 | STRING | — |
| video_5 | VIDEO | — |
| filename_5 | STRING | — |
| video_6 | VIDEO | — |
| filename_6 | STRING | — |
| video_7 | VIDEO | — |
| filename_7 | STRING | — |
| video_8 | VIDEO | — |
| filename_8 | STRING | — |
| video_9 | VIDEO | — |
| filename_9 | STRING | — |
| video_10 | VIDEO | — |
| filename_10 | STRING | — |
| report | STRING | — |