防止 Pydub 打开控制台窗口

3
有没有办法防止pydub在使用ffmpeg(在Windows上)时打开控制台窗口?每次它启动ffmpeg将mp3文件转换为wav时,它都会短暂地打开一个控制台窗口,当进程完成时自动关闭,但可能会干扰操作。

pydub在子进程中运行ffmpeg - 我不太了解Windows,但也许这个小提示会帮助其他人回答问题? - Jiaaro
1
在audio_segment.py中,我更改了两个p = subprocess.Popen(conversion_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)行,添加了creationflags=0x08000000。这似乎是避免在这些调用中显示命令窗口的一种相当常见的方法,因此如果可能的话,也许值得将其放入pydub本身中? - dingles
只需手动运行FFmpeg即可。 - Smiley1000
3个回答

3
我使用的解决方案是重载from_file函数。我只改变了subprocess调用,添加了startupinfo选项。这里是我添加的几行代码:
import platform  
systeme = platform.system()  
if systeme == 'Windows':  
    startupinfo = subprocess.STARTUPINFO()  
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    startupinfo.wShowWindow = subprocess.SW_HIDE
    p = subprocess.Popen(conversion_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo)
else:  
    p = subprocess.Popen(conversion_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)`

0
我在任何使用pydub的脚本中进行以下操作:
在import pydub之前添加 import subprocess 然后,在脚本中使用pydub之前,我添加了以下代码: if subprocess.mswindows:subprocess.STARTUPINFO.dwFlags | = subprocess.STARTF_USESHOWWINDOW 这告诉该脚本的任何子进程调用(无论是否通过pydub指令)默认不显示窗口,而是查看另一个名为wShowWindow的标志以决定是否显示。由于该标志默认为0,因此不会显示窗口。
注意:dwFlags不再是STARTUPINFO的类属性,而是实例属性(例如Python 3.9等新版本),因此此答案对新版本不起作用。必须创建一个 STARTUPINFO()对象。

0

您可以在运行时修改源代码并重新编译它。

# Created by BaiJiFeiLong@gmail.com at 2022/2/18 22:09
import importlib.util
import re
import sys
import types

import pydub
from IceSpringPathLib import Path

for moduleName in "pydub.utils", "pydub.audio_segment":
    spec = importlib.util.find_spec(moduleName, None)
    source = spec.loader.get_source(moduleName)
    snippet = "__import__('subprocess').STARTUPINFO(dwFlags=__import__('subprocess').STARTF_USESHOWWINDOW)"
    source, n = re.subn(r"(Popen)\((.+?)\)", rf"\1(\2, startupinfo=print('worked') or {snippet})", source, flags=re.DOTALL)
    module = importlib.util.module_from_spec(spec)
    exec(compile(source, module.__spec__.origin, "exec"), module.__dict__)
    sys.modules[moduleName] = module
module = importlib.reload(sys.modules["pydub"])
for k, v in module.__dict__.items():
    if isinstance(v, types.ModuleType):
        setattr(module, k, importlib.import_module(v.__name__))

pydub.audio_segment.AudioSegment.from_file(Path("~/Music").expanduser().glob("**/*.mp3").__next__())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接