{"record":{"id":"49e02d6663d4a8bb","repo":"Comfy-Org/ComfyUI","slug":"saveaudiomp3-input-audio-is-none-source-video-ma","errorCode":null,"errorMessage":"SaveAudioMP3: input audio is None (source video may have no audio track).","messagePattern":"SaveAudioMP3: input audio is None \\(source video may have no audio track\\)\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_extras/nodes_audio.py","lineNumber":211,"sourceCode":"            search_aliases=[\"export mp3\"],\n            display_name=\"Save Audio (MP3) (DEPRECATED)\",\n            category=\"audio\",\n            essentials_category=\"Audio\",\n            inputs=[\n                IO.Audio.Input(\"audio\"),\n                IO.String.Input(\"filename_prefix\", default=\"audio/ComfyUI\"),\n                IO.Combo.Input(\"quality\", options=[\"V0\", \"128k\", \"320k\"], default=\"V0\"),\n            ],\n            hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo],\n            is_deprecated=True,\n            is_output_node=True,\n            outputs=[IO.Audio.Output(\"audio\")]\n        )\n\n    @classmethod\n    def execute(cls, audio, filename_prefix=\"ComfyUI\", format=\"mp3\", quality=\"128k\") -> IO.NodeOutput:\n        if audio is None:\n            raise ValueError(\"SaveAudioMP3: input audio is None (source video may have no audio track).\")\n        return IO.NodeOutput(\n            audio,\n            ui=UI.AudioSaveHelper.get_save_audio_ui(\n                audio, filename_prefix=filename_prefix, cls=cls, format=format, quality=quality\n            )\n        )\n\n\nclass SaveAudioOpus(IO.ComfyNode):\n    @classmethod\n    def define_schema(cls):\n        return IO.Schema(\n            node_id=\"SaveAudioOpus\",\n            search_aliases=[\"export opus\"],\n            display_name=\"Save Audio (Opus) (DEPRECATED)\",\n            category=\"audio\",\n            inputs=[\n                IO.Audio.Input(\"audio\"),","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_extras/nodes_audio.py#L193-L229","documentation":"SaveAudioMP3.execute raises when audio is None — the MP3 export variant of SaveAudio with the identical None-input guard. The encoder (via UI.AudioSaveHelper) needs a waveform and sample rate, so a None audio object aborts execution.","triggerScenarios":"MP3 export node receiving the audio output of a video loader whose video lacked an audio track, or any unconnected/None optional audio input.","commonSituations":"Converting video audio to MP3 in batch pipelines where some inputs are silent; deprecated SaveAudioMP3 usage after refactors changed upstream node outputs.","solutions":["Confirm the upstream source has audio; use ffprobe if unsure","Feed the node from LoadAudio or a generator node instead of a silent video's audio tap","Skip the MP3 branch when audio is None via a switch node"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"if audio is None:\n    return  # skip MP3 export","typeGuard":"def is_audio(v) -> bool:\n    return isinstance(v, dict) and 'waveform' in v and 'sample_rate' in v","tryCatchPattern":null,"preventionTips":["Check for None audio before export nodes","Use ffprobe to prefilter silent files in batch jobs","Prefer the non-deprecated save nodes going forward"],"tags":["audio","mp3","none-input"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}