Comfy-Org/ComfyUI · error · ValueError

SaveAudioOpus: input audio is None (source video may have no

Error message

SaveAudioOpus: input audio is None (source video may have no audio track).

What it means

SaveAudioOpus.execute raises when audio is None — the Opus export variant of the audio save nodes with the same None guard. Without a waveform the Opus encoder cannot run, so execution stops with a message pointing at a missing audio track.

Source

Thrown at comfy_extras/nodes_audio.py:242

            node_id="SaveAudioOpus",
            search_aliases=["export opus"],
            display_name="Save Audio (Opus) (DEPRECATED)",
            category="audio",
            inputs=[
                IO.Audio.Input("audio"),
                IO.String.Input("filename_prefix", default="audio/ComfyUI"),
                IO.Combo.Input("quality", options=["64k", "96k", "128k", "192k", "320k"], default="128k"),
            ],
            hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo],
            is_deprecated=True,
            is_output_node=True,
            outputs=[IO.Audio.Output("audio")]
        )

    @classmethod
    def execute(cls, audio, filename_prefix="ComfyUI", format="opus", quality="V3") -> IO.NodeOutput:
        if audio is None:
            raise ValueError("SaveAudioOpus: input audio is None (source video may have no audio track).")
        return IO.NodeOutput(
            audio,
            ui=UI.AudioSaveHelper.get_save_audio_ui(
                audio, filename_prefix=filename_prefix, cls=cls, format=format, quality=quality
            )
        )


class SaveAudioAdvanced(IO.ComfyNode):
    @classmethod
    def define_schema(cls):
        return IO.Schema(
            node_id="SaveAudioAdvanced",
            search_aliases=["save audio", "export audio", "output audio", "write audio", "flac", "mp3", "opus"],
            display_name="Save Audio (Advanced)",
            description="Saves the input audio to your ComfyUI output directory.",
            category="audio",
            inputs=[

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Check the input container actually has an audio stream before wiring it to export
  2. Source audio from LoadAudio or an audio-generating node
  3. Gate the export branch on audio being non-None
Defensive patterns

Strategy: type-guard

Validate before calling

if audio is None:
    return  # skip Opus export

Type guard

def is_audio(v) -> bool:
    return isinstance(v, dict) and 'waveform' in v and 'sample_rate' in v

Prevention

When it happens

Trigger: Opus export wired to a LoadVideo audio output that is None (no audio stream in container), or an optional audio socket that never received a value.

Common situations: Podcast/voice pipelines exporting Opus where one input file is silent video; template workflows reused across heterogeneous sources.

Related errors


AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14). Data as JSON: /api/errors/3a91f6d1173a8e87. Report an issue: GitHub.