
Audio output from Load Video nodes does not handle no-audio case when applied as input to Video Combine
快速结论:当使用 Load Video 节点加载无音频文件(如 GIF 或无音轨的 MP4)并将 audio 输出连接到 Video Combine 节点时,会触发 ffmpeg 调用失败,导致工作流报错中断。优先排查 VideoHelperSuite 是否为最新版本,并注意 workflow 中 audio 连线是否正确处理了无音频的情况。
问题场景
在 ComfyUI 中使用 VideoHelperSuite 自定义节点,通过 Load Video 节点加载 GIF 或无音频轨道的 MP4 文件,然后将节点的 audio 输出连接到 Video Combine 节点(输出格式配置为支持音频的格式,如 .mp4)时触发。
报错原文
Error occurred when executing VHS_VideoCombine:
VHS failed to extract audio from /workspace/ComfyUI/input/123 (12).mp4:
...
Output #0, f32le, to 'pipe:':
Output file #0 does not contain any stream
File ".../videohelpersuite/nodes.py", line 523, in combine_video
channels = audio['waveform'].size(1)
File ".../videohelpersuite/utils.py", line 194, in __getitem__
self._dict = get_audio(self.file, self.start_time, self.duration)
File ".../videohelpersuite/utils.py", line 173, in get_audio
raise Exception(f"VHS failed to extract audio from {file}:" ...)
原因分析
该问题由多个小错误叠加引起:
get_audio函数内部对 ffmpeg 的子进程调用没有做完善的错误捕获,当尝试从无音频媒体文件中提取音频时,ffmpeg 抛出subprocess.CalledProcessError。- 该异常被错误地当作对最终音频编码调用的失败来捕获,而非对
get_audio自身的异常处理。 get_audio仅捕获了 stdout 而未捕获 stderr,因此e.stderr在get_audio内部异常时未被正确设置。- 无音频输入时,
audio['waveform'].size(1)试图访问不存在的音频张量,导致NoneType错误。
环境排查
- 确认
ComfyUI-VideoHelperSuite版本是否为最新(该 Issue 于 2024-02-08 关闭,更早版本可能仍存在此 Bug)。 - 确认系统
ffmpeg版本是否正常工作(建议 4.4+)。 - 检查 Load Video 节点的输入文件是否为真正的无音频格式(如 GIF)或 MP4 无音轨。
解决步骤
- 更新 VideoHelperSuite 到最新版本。 修复已在 2024-02-08 的提交中实施,关键改动包括:在
get_audio的子进程调用中加入错误捕获;当连接的音频输入无法解析为有效的音频流时,Video Combine 跳过音频处理阶段。 - 升级后,当 Load Video 节点加载无音频文件并将 audio 连线到 Video Combine 时,会在控制台打印音频提取失败的错误原因,但工作流不会中断,会如同未连接 audio 一样继续执行。
- 如果仍遇到类似报错,检查 ffmpeg 是否正确安装并可在命令行直接调用。
- 考虑在工作流中,对无音频的输入源不连接 audio 输出到 Video Combine,或使用条件节点进行判断。
验证方法
使用 Load Video 节点加载一个 GIF 文件(或一个确认无音轨的 MP4 文件),将 audio 输出连接到 Video Combine 节点(输出格式选 .mp4)。运行工作流后,应不再抛出异常中断,控制台会显示类似“VHS failed to extract audio from …”的警告信息,但 Video Combine 仍会正常输出无音频的视频文件。



