Instagram Question Box - Video
That Instagram question sticker, but animated over your video
- video_path
The image version of Instagram Question Box is great for a still story frame, but stories are usually video. This is that same two-panel "Ask me a question" sticker, rendered on every frame of a real video file, written back out as a new MP4 - with the original audio track stitched back in. You get the full sticker look with animation, and the result drops straight into ComfyUI's output folder.
Mechanically it's the video counterpart to the pack's Advanced Text Overlay - Video node: imageio reads the source frame by frame, the same 4×-supersampled rounded-box renderer (Lanczos downscale, Gaussian-blur shadow) composites the sticker over each frame, and the writer spits out an MP4. At the end ffmpeg does a stream copy (-c copy -map 0:v:0 -map 1:a:0) to re-mux the original audio, so the soundtrack comes along untouched. If ffmpeg isn't available, you still get a perfectly good silent video and a console warning.
The inputs that matter
The full sticker controls from the image node are here - question_text, answer_text, the separate question_font / answer_font typography clusters, box_width / header_height / body_height (defaults tuned for a 1080-wide portrait story), corner_radius, box_shadow_*, and positioning. The differences are at the top:
video_path- full path to the input video file.filename_prefix- output is named{prefix}_{original}.mp4(defaultIGQuestion), auto-incrementing so it never clobbers an existing file.delete_original- removes the source video after processing. Leave it off until you've verified the output.pause_seconds_before_start- the pause before animation starts, in seconds, converted to frames using the source FPS. This is the video-node version ofpause_frames_before_start, which is what the image node uses.
Everything else behaves like the still version: answer text supports the inline <b> / <i> / <br> / <span color> rich text, word-wraps to the box, and the animation system fades or slides the sticker in over animation_frames, then holds the final pose for the rest of the clip. The single output is a video_path string, and the node is flagged as an output node so the result shows up in the outputs panel.
Installing it
Same pack, same install as the other three nodes - ComfyUI Manager, search "Advanced Text Overlay", or:
cd ComfyUI/custom_nodes
git clone https://github.com/scofano/ComfyUI-Advanced-TextOverlay
pip install -r requirements.txt
Restart, and it's under Advanced Text Overlay. No models or keys required.
Where people get burned
Two things, both shared with the pack's other video node. First, ffmpeg is an external binary, not a pip dependency - if it's missing from your PATH the video renders but comes out silent. Second, this is a full per-frame re-encode, so a long clip takes a while; set your animation_frames sensibly and don't expect real-time. And because delete_original nukes the source, run one render with it off first. The header text still truncates with an ellipsis rather than wrapping, so keep question_text short - the detail belongs in the body.
Inputs (40)
| Name | Type | Default | Description |
|---|---|---|---|
| video_path | STRING | — | |
| filename_prefix | STRING | IGQuestion | — |
| delete_original | BOOLEAN | false | — |
| question_text | STRING | Ask me a question | — |
| answer_text | STRING | — | |
| question_font | COMBO | Arial Black | 33 options: Arial, Arial Black, Arial Narrow, C059, Comic Sans MS, Courier New, +27 |
| question_font_size | INT | 301–999 | — |
| question_letter_spacing | FLOAT | -0.5-10–50 | — |
| question_fill_color_hex | STRING | #FFFFFF | — |
| question_fill_alpha | FLOAT | 1.000–1 | — |
| answer_font | COMBO | Arial | 33 options: Arial, Arial Black, Arial Narrow, C059, Comic Sans MS, Courier New, +27 |
| answer_font_size | INT | 501–999 | — |
| answer_letter_spacing | FLOAT | 0.0-10–50 | — |
| answer_line_spacing | FLOAT | 4.00–100 | — |
| answer_fill_color_hex | STRING | #000000 | — |
| answer_fill_alpha | FLOAT | 1.000–1 | — |
| box_width | INT | 95050–4096 | — |
| header_height | INT | 9010–2048 | — |
| body_height | INT | 20010–2048 | — |
| answer_padding | INT | 160–512 | — |
| header_color_hex | STRING | #323b42 | — |
| header_alpha | FLOAT | 1.000–1 | — |
| body_color_hex | STRING | #FFFFFF | — |
| body_alpha | FLOAT | 1.000–1 | — |
| corner_radius | INT | 320–200 | — |
| box_shadow_enable | BOOLEAN | true | — |
| box_shadow_color_hex | STRING | #000000 | — |
| box_shadow_alpha | FLOAT | 0.500–1 | — |
| box_shadow_distance | INT | 100–100 | — |
| box_shadow_blur | INT | 150–60 | — |
| horizontal_alignment | COMBO | center | 3 options: left, center, right |
| vertical_alignment | COMBO | middle | 3 options: top, middle, bottom |
| x_shift | INT | 0-4096–4096 | — |
| y_shift | INT | 0-4096–4096 | — |
| animate | BOOLEAN | false | — |
| animation_kind | COMBO | fade_in | 6 options: fade_in, fade_out, move_from_top, move_from_bottom, move_from_left, move_from_right |
| animation_frames | INT | 321–1000 | — |
| animation_ease | COMBO | ease_in_out | 4 options: linear, ease_in, ease_out, ease_in_out |
| animation_opacity_target | FLOAT | 1.000–1 | — |
| pause_seconds_before_start | INT | 00–100000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |