
在 Windows 环境下使用 Python 的 subprocess.run() 调用 ffprobe 获取视频时长时,即使设置了日志静默参数,仍会短暂弹出命令行窗口;通过添加 creationflags=subprocess.CREATE_NO_WINDOW 即可彻底隐藏该控制台窗口。
在 windows 环境下使用 python 的 `subprocess.run()` 调用 `ffprobe` 获取视频时长时,即使设置了日志静默参数,仍会短暂弹出命令行窗口;通过添加 `creationflags=subprocess.create_no_window` 即可彻底隐藏该控制台窗口。
在 Windows 平台上,subprocess.run() 默认会为子进程创建一个关联的控制台窗口(即使父进程是 .pyw 文件),这是系统级行为,与 ffprobe 的 -hide_banner 或 -v quiet 等参数无关——这些仅控制命令内部的日志输出,无法抑制窗口本身的创建。
解决方法非常简洁:从 Python 3.7 开始,subprocess 模块支持 creationflags 参数,配合 subprocess.CREATE_NO_WINDOW 标志即可阻止新控制台窗口的生成。该标志仅在 Windows 下有效,跨平台安全(在 Linux/macOS 下会被自动忽略,无副作用)。
以下是推荐的完整实现示例:
在 Windows 11 上"直接发声"的 TTS(从 WSL2/TUI 调用 powershell.exe + System.Speech)。适用于用户说"说出来/读出来/语音播报/用TTS",或反馈"没声音/tts 生成的 mp3 是空的/播不出来",以及需要中文语音但 OpenClaw 内置 tts 不可用时。
import subprocess
import sys
def get_video_duration(filename: str) -> float:
"""获取视频文件时长(秒),Windows 下静默执行,无黑窗闪烁"""
try:
result = subprocess.run(
[
"ffprobe",
"-hide_banner",
"-v", "quiet",
"-show_entries", "format=duration",
"-of", "default=noprint_wrappers=1:nokey=1",
filename
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
creationflags=subprocess.CREATE_NO_WINDOW, # ✅ 关键:隐藏控制台窗口
timeout=10 # 防止异常卡死
)
if result.returncode != 0:
raise RuntimeError(f"ffprobe failed with code {result.returncode}: {result.stdout.decode().strip()}")
duration_str = result.stdout.decode().strip()
return float(duration_str) if duration_str else 0.0
except subprocess.TimeoutExpired:
raise TimeoutError("ffprobe timed out while analyzing video")
except ValueError:
raise ValueError("Invalid duration value returned by ffprobe")
except FileNotFoundError:
raise FileNotFoundError("ffprobe not found in PATH — please install FFmpeg and ensure it's accessible")
# 使用示例
if __name__ == "__main__":
try:
dur = get_video_duration("example.mp4")
print(f"Duration: {dur:.2f} seconds")
except Exception as e:
print(f"Error: {e}")
⚠️ 注意事项:
-
CREATE_NO_WINDOW仅适用于 Windows;若需完全跨平台兼容,建议用sys.platform == "win32"做条件判断包裹该参数; - 确保
ffprobe.exe已加入系统PATH,或改用绝对路径(如r"C:\ffmpeg\bin\ffprobe.exe")以避免FileNotFoundError; -
.pyw扩展名本身不能阻止子进程创建控制台,它只影响 Python 主解释器是否显示窗口,子进程行为由creationflags决定; - 若项目面向 Kodi 插件等受限环境,建议增加超时(
timeout=)和异常处理,防止因损坏视频或路径错误导致插件无响应。
综上,creationflags=subprocess.CREATE_NO_WINDOW 是 Windows 下静默调用命令行工具的标准化、轻量且可靠方案,无需依赖第三方库或复杂封装。










