Nodes/comfyui_AcademiaSD/Academia SD Moviola ๐ŸŽž๏ธ
ComfyUI Node

Academia SD Moviola ๐ŸŽž๏ธ

Moviola is the part of a chained-video workflow that actually cuts the film

By AcademiaSDยทCreated about a year agoยทUpdated about 21 hours agoยท 78
Academia SD Moviola ๐ŸŽž๏ธ
      โ—„pathmoviola/loopโ–บ
      โ—„latent_frames1โ–บ
      โ—„crf18โ–บ

      Every decent local video model gives you five to ten seconds and then stops. MiniMax H3, LTX, Wan - same wall. So the real project is rarely one clip: it's fifteen takes that are supposed to look like one film. Almost every video workflow ends up with a folder of vid_loop_0000N.mp4 takes and an unglamorous question - who joins them, and where do you cut?

      Academia SD Moviola ๐ŸŽž๏ธ is the answer from the pack AcademiaSD/comfyui_AcademiaSD. It's the editor at the end of the chain: it joins the takes into one file, and lets you delete the last one and re-shoot it.

      What it actually does on a queue

      Nothing, on purpose.

      Hit Queue and nothing new appears. That's the design: joining ten clips is minutes of encoding, and doing it every pass would rebuild the whole cut nine times to throw eight away. So executing the node only reports: project folder, current take, how many latents, how many videos, how many interpolated ones. The work happens when you press a button - ๐ŸŽฌ Auto Film Edit, ๐Ÿ—‘ Delete Last Loop, ๐Ÿ—‘ Delete All Loops, ๐Ÿ”„ Refresh. A player appears in the node once a cut exists, with a tab for the plain file and one for the interpolated cut.

      The cut is written with PyAV - the library ComfyUI already uses for video - so it launches no ffmpeg binary and doesn't care what's on your PATH.

      The inputs that matter

      Three, and no outputs at all - it's a terminal node.

      • path - default moviola/loop, the project folder. In practice you wire it from the pack's Project Paths node instead of typing it. The node re-resolves path before every button press rather than remembering the last run - which matters, because the button next to it deletes files.
      • latent_frames - 1 to 8, default 1. The author's own tooltip calls it "only a guide: it is used where a seam is too still to measure," and says to keep it the same value as Moviola Out. On H3 with a 2-latent anchor, say so here.
      • crf - x264 quality of the joined file, 0โ€“51, default 18. Raise it for a smaller file; the tooltip's own numbers are "16 is near-transparent, 24 is about a third of the size."

      How the seams are handled (this is the good part)

      Naive concatenation of generated clips looks broken, for two specific reasons. New takes don't start where the old one ended - the model gets the previous latent as a keyframe and redraws that motion, so there's a short rewind at the head. And every take is generated separately, so exposure drifts.

      So the montage makes three corrections. It compares the last frame of clip A against the first twenty of clip B; that profile comes out as a V and the cut goes one frame past the minimum, because the minimum is the frame that repeats. It fixes brightness with a per-channel gain, measured against the frame that survives the trim and accumulated down the series, because a slow drift never looks wrong at any single seam. And the overlap in the audio is a genuine rewind, so a crossfade shifts nothing; clips arrive ~26 ms short in audio, absorbed with atempo instead of padded silence. No audio track, or mismatched ones? It says so and joins picture only - silent projects join fine.

      Installing it

      Search comfyui_AcademiaSD in ComfyUI Manager, or do it by hand:

      cd ComfyUI/custom_nodes
      git clone https://github.com/AcademiaSD/comfyui_AcademiaSD
      

      Restart ComfyUI. The repo has no requirements.txt and declares no dependencies - the Moviola nodes run on what ComfyUI already ships (av, numpy, torch, Pillow, safetensors). The pack also ships a HuggingFace VLM loader that wants transformers, huggingface_hub and bitsandbytes installed yourself; without them you'll see Error loading node from academia_loader.py and everything else still loads, since each file is loaded in its own try/except.

      One trap from the README: the Moviola sockets changed in 2.4.5, so after updating, restart and use Fix node (recreate) - workflow JSON saved with old sockets doesn't know they moved.

      Where people get burned

      If Auto Film Edit says nothing found, read the prefix it prints. It derives what it looks for from path's basename: loop makes it hunt vid_loop_#####.mp4 and vid_int_loop_#####.mp4 - which only exist if your video savers are wired to vid_path and vid_int_loop from Project Paths. Wire a saver elsewhere and it hunts filenames that were never written. It won't join a single clip either: one take just reports nothing to join, so you need two.

      Delete Last Loop is thorough by design: the latent, both videos, the PNGs, any half-written .tmp numbered with that take - leftovers would make the retaken shot open with the old one's tail. It names the project in its confirmation and reports what's left afterwards. Trust that dialog.

      CategoryAcademia SD

      Inputs (3)

      NameTypeDefaultDescription
      pathSTRINGmoviola/loopโ€”
      latent_framesINT11โ€“8Same value as Moviola Out. Only a guide: it is used where a seam is too still to measure.
      crfINT180โ€“51x264 quality of the joined file. Raise it for a smaller file; 16 is near-transparent, 24 is about a third of the size.

      Outputs (0)

      No outputs