ComfyPilotComfyPilot
工作流 / 视频工具 / 相机控制:MiniMax H3 Max
相机控制:MiniMax H3 Max

相机控制:MiniMax H3 Max

Camera Control: MiniMax H3 Max

Orbit the camera around a still image with MiniMax H3 Max: the image becomes the first frame and the model renders the move to a new azimuth, elevation and distance, generating whatever the camera uncovers. Leave the pro…

视频工具 7 个节点 2 个输入 60 次使用 ComfyUI ≥ 0.44.0 ComfyUI 12 KB

下载工作流 JSON 查看官方来源

下载后把文件拖进 ComfyUI 窗口即可打开。

节点构成

LoadImage × 1
MinimaxHailuo03MaxCameraControlNode × 1
GetVideoComponents × 1
LoadAudio × 1
CreateVideo × 1
SaveVideo × 1
MarkdownNote × 1

官方标注的模型

MiniMax H3

工作流 JSON

和上面「下载工作流 JSON」是同一份文件。

1{
2 "id": "8c31f0a4-0000-4000-8000-000000000003",
3 "revision": 0,
4 "last_node_id": 7,
5 "last_link_id": 5,
6 "nodes": [
7 {
8 "id": 1,
9 "type": "LoadImage",
10 "pos": [
11 60,
12 220
13 ],
14 "size": [
15 300,
16 320
17 ],
18 "flags": [],
19 "order": 0,
20 "mode": 0,
21 "inputs": [],
22 "outputs": [
23 {
24 "name": "IMAGE",
25 "type": "IMAGE",
26 "links": [
27 1
28 ]
29 },
30 {
31 "name": "MASK",
32 "type": "MASK",
33 "links": null
34 }
35 ],
36 "properties": {
37 "Node name for S&R": "LoadImage"
38 },
39 "widgets_values": [
40 "api_minimax_h3_max_camera_control_input.png",
41 "image"
42 ],
43 "widgets_values_named": {
44 "image": "api_minimax_h3_max_camera_control_input.png",
45 "upload": "image"
46 }
47 },
48 {
49 "id": 2,
50 "type": "MinimaxHailuo03MaxCameraControlNode",
51 "pos": [
52 420,
53 140
54 ],
55 "size": [
56 420,
57 420
58 ],
59 "flags": [],
60 "order": 1,
61 "mode": 0,
62 "inputs": [
63 {
64 "name": "model.image",
65 "type": "IMAGE",
66 "link": 1
67 }
68 ],
69 "outputs": [
70 {
71 "name": "VIDEO",
72 "type": "VIDEO",
73 "links": [
74 2
75 ]
76 }
77 ],
78 "properties": {
79 "Node name for S&R": "MinimaxHailuo03MaxCameraControlNode"
80 },
81 "widgets_values": [
82 "MiniMax H3 Max",
83 "For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.\n\nintegrated_multimodal_description: [Shot 1] Live-action, cinematic, a medium-wide shot frames the woman in the red coat from <Picture 1>, standing on a wet city street at dusk, her long dark hair moving in the wind and red neon lettering glowing behind her. The camera holds an Arc Shot with small amplitude at slow speed around her while storefronts and passing headlights slide across the background. She turns her head toward the lens, her boots scuffing once on the wet asphalt, then looks past it as neon reflections travel across the ground.\n\noverall_soundscape: Rain ticks lightly on the metal awnings overhead. A single car swishes past on wet asphalt and fades.\n\nnon_diegetic_music: N/A",
84 80,
85 8,
86 0.9,
87 5,
88 "768P",
89 "balanced",
90 42,
91 "randomize"
92 ],
93 "widgets_values_named": {
94 "model": "MiniMax H3 Max",
95 "model.prompt": "For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.\n\nintegrated_multimodal_description: [Shot 1] Live-action, cinematic, a medium-wide shot frames the woman in the red coat from <Picture 1>, standing on a wet city street at dusk, her long dark hair moving in the wind and red neon lettering glowing behind her. The camera holds an Arc Shot with small amplitude at slow speed around her while storefronts and passing headlights slide across the background. She turns her head toward the lens, her boots scuffing once on the wet asphalt, then looks past it as neon reflections travel across the ground.\n\noverall_soundscape: Rain ticks lightly on the metal awnings overhead. A single car swishes past on wet asphalt and fades.\n\nnon_diegetic_music: N/A",
96 "model.azimuth": 80,
97 "model.elevation": 8,
98 "model.distance": 0.9,
99 "model.duration": 5,
100 "model.resolution": "768P",
101 "model.prompt_expansion_mode": "balanced",
102 "model.seed": 42,
103 "control_after_generate": "randomize"
104 }
105 },
106 {
107 "id": 3,
108 "type": "GetVideoComponents",
109 "pos": [
110 420,
111 600
112 ],
113 "size": [
114 300,
115 170
116 ],
117 "flags": [],
118 "order": 2,
119 "mode": 0,
120 "inputs": [
121 {
122 "name": "video",
123 "type": "VIDEO",
124 "link": 2
125 }
126 ],
127 "outputs": [
128 {
129 "name": "images",
130 "type": "IMAGE",
131 "links": [
132 3
133 ]
134 },
135 {
136 "name": "audio",
137 "type": "AUDIO",
138 "links": null
139 },
140 {
141 "name": "fps",
142 "type": "FLOAT",
143 "links": null
144 },
145 {
146 "name": "bit_depth",
147 "type": "COMBO",
148 "links": null
149 },
150 {
151 "name": "color_space",
152 "type": "COMBO",
153 "links": null
154 }
155 ],
156 "properties": {
157 "Node name for S&R": "GetVideoComponents"
158 },
159 "widgets_values": []
160 },
161 {
162 "id": 4,
163 "type": "LoadAudio",
164 "pos": [
165 60,
166 620
167 ],
168 "size": [
169 320,
170 140
171 ],
172 "flags": [],
173 "order": 3,
174 "mode": 0,
175 "inputs": [],
176 "outputs": [
177 {
178 "name": "AUDIO",
179 "type": "AUDIO",
180 "links": [
181 4
182 ]
183 }
184 ],
185 "properties": {
186 "Node name for S&R": "LoadAudio"
187 },
188 "widgets_values": [
189 "api_minimax_h3_max_camera_control_music.mp3"
190 ],
191 "widgets_values_named": {
192 "audio": "api_minimax_h3_max_camera_control_music.mp3"
193 }
194 },
195 {
196 "id": 5,
197 "type": "CreateVideo",
198 "pos": [
199 880,
200 560
201 ],
202 "size": [
203 340,
204 230
205 ],
206 "flags": [],
207 "order": 4,
208 "mode": 0,
209 "inputs": [
210 {
211 "name": "images",
212 "type": "IMAGE",
213 "link": 3
214 },
215 {
216 "name": "audio",
217 "type": "AUDIO",
218 "link": 4
219 }
220 ],
221 "outputs": [
222 {
223 "name": "VIDEO",
224 "type": "VIDEO",
225 "links": [
226 5
227 ]
228 }
229 ],
230 "properties": {
231 "Node name for S&R": "CreateVideo"
232 },
233 "widgets_values": [
234 24,
235 "auto",
236 "sRGB",
237 "auto",
238 "auto"
239 ],
240 "widgets_values_named": {
241 "fps": 24,
242 "bit_depth": "auto",
243 "color_space": "sRGB",
244 "chroma_subsampling": "auto",
245 "codec": "auto"
246 }
247 },
248 {
249 "id": 6,
250 "type": "SaveVideo",
251 "pos": [
252 880,
253 140
254 ],
255 "size": [
256 420,
257 300
258 ],
259 "flags": [],
260 "order": 5,
261 "mode": 0,
262 "inputs": [
263 {
264 "name": "video",
265 "type": "VIDEO",
266 "link": 5
267 }
268 ],
269 "outputs": [
270 {
271 "name": "video",
272 "type": "VIDEO",
273 "links": null
274 }
275 ],
276 "properties": [],
277 "widgets_values": [
278 "api_minimax_h3_max_camera_control",
279 "auto",
280 "auto",
281 "auto"
282 ],
283 "widgets_values_named": {
284 "filename_prefix": "api_minimax_h3_max_camera_control",
285 "format": "auto",
286 "format.codec": "auto",
287 "codec": "auto"
288 }
289 },
290 {
291 "id": 7,
292 "type": "MarkdownNote",
293 "pos": [
294 -300,
295 820
296 ],
297 "size": [
298 1180,
299 980
300 ],
301 "flags": [],
302 "order": 6,
303 "mode": 0,
304 "inputs": [],
305 "outputs": [],
306 "properties": [],
307 "widgets_values": [
308 "## Camera Control: MiniMax H3 Max\n\n**Input Assets**\n- [api_minimax_h3_max_camera_control_input.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_camera_control_input.png) — required workflow input (`input/api_minimax_h3_max_camera_control_input.png`)\n- [api_minimax_h3_max_camera_control_music.mp3](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_camera_control_music.mp3) — required workflow input (`input/api_minimax_h3_max_camera_control_music.mp3`)\n\n**Move the camera around a still image, then put your own music under it.** The image is the first frame; the node renders the move to a new azimuth, elevation and distance and generates its own ambience. The graph then takes the picture back out of that clip and rebuilds it with a music bed, because the model's own score for a near-static shot comes out as a low rumble.\n\n---\n\n### What this graph does\n\n1. **Load Image**: the opening frame, at least 256 x 256 and an aspect ratio between 0.4 and 2.5.\n2. **MiniMax H3 Max Camera Control**: the camera move and the model's own audio.\n3. **Get Video Components**: splits the generated clip into frames, audio and fps. Only the frames and the fps are used here.\n4. **Load Audio**: the music bed.\n5. **Create Video**: rebuilds the clip from the frames at the same fps and attaches the music instead of the model audio.\n6. **Save Video**: writes `api_minimax_h3_max_camera_control.mp4`.\n\nTo keep the model's ambience as well, route `Get Video Components` audio into `Audio Concat` with the music and feed the result into `Create Video`.\n\n### Prompt format\n\nThe node reads MiniMax H3 prompts, so the prompt follows the official I2VA structure rather than a plain sentence:\n\n```text\nFor the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.\n\nintegrated_multimodal_description: [Shot 1] Live-action, cinematic, ... The camera holds an Arc Shot with small amplitude at slow speed ...\n\noverall_soundscape: ...\n\nnon_diegetic_music: ...\n```\n\n- The alignment line stays first.\n- `integrated_multimodal_description` carries the visual timeline, the camera vocabulary (`Arc Shot`, `Push In`, `Tracking Shot`, with `small/large amplitude` and `slow/fast speed`) and any dialogue in `<d>[English] ...</d>`.\n- `overall_soundscape` holds ambience and physical sound, `non_diegetic_music` the audience-only score. Write `N/A` when you intend to add music afterwards, as this template does.\n\n### Parameters\n\n| Widget | What it does |\n|---|---|\n| `azimuth` | Horizontal orbit in degrees, `-360` to `360`; positive moves the camera right. |\n| `elevation` | End angle above or below the subject, `-90` to `90`; positive looks down. |\n| `distance` | End distance relative to the start: `1` keeps it, below `1` pushes in, above `1` pulls back. |\n| `duration` | 1 to 15 seconds; this example runs 5. |\n| `resolution` | `480P`, `768P` or `1080P`. |\n| `prompt_expansion_mode` | `disabled`, `balanced` or `quality`. |\n\n### Measured on this graph\n\n`api_minimax_h3_max_camera_control_input.png` (1024 x 1024, a woman in a red coat under neon) produced 768 x 768, 124 frames, 5.17 s at 24 fps. With the music bed attached the track measures a 4.7 kHz spectral centroid with 59 percent of its energy above 2 kHz; the same clip with only the model audio measured 718 Hz with 9 percent.\n\n### Gotchas\n\n- `azimuth` is a target, not a guarantee: a 90 degree request often lands between 30 and 90 degrees.\n- A camera-info node connected to `camera_info` overrides `azimuth` and `elevation`.\n- The image aspect ratio must stay between 0.4 and 2.5.\n- `Create Video` re-encodes the frames, so the clip loses the model's audio unless you mix it back in with `Audio Concat`.\n- Trim the music to the clip length; `Create Video` runs until the shorter of the two ends.\n"
309 ]
310 }
311 ],
312 "links": [
313 [
314 1,
315 1,
316 0,
317 2,
318 0,
319 "IMAGE"
320 ],
321 [
322 2,
323 2,
324 0,
325 3,
326 0,
327 "VIDEO"
328 ],
329 [
330 3,
331 3,
332 0,
333 5,
334 0,
335 "IMAGE"
336 ],
337 [
338 4,
339 4,
340 0,
341 5,
342 1,
343 "AUDIO"
344 ],
345 [
346 5,
347 5,
348 0,
349 6,
350 0,
351 "VIDEO"
352 ]
353 ],
354 "groups": [],
355 "config": [],
356 "extra": {
357 "ds": {
358 "scale": 0.45,
359 "offset": [
360 140,
361 -60
362 ]
363 },
364 "frontendVersion": "1.58.5"
365 },
366 "version": 0.4
367}