【问题标题】:prevent pydub from opening console window防止 pydub 打开控制台窗口
【发布时间】:2017-02-26 06:30:40
【问题描述】:

有没有办法防止 pydub 在使用 ffmpeg(在 Windows 上)时打开控制台窗口?每次启动 ffmpeg 以将 mp3 文件转换为 wav 时,它都会短暂打开一个控制台窗口,该窗口会在处理完成后自动关闭,但可能会令人不安。

【问题讨论】:

  • pydub在子进程中运行ffmpeg——我对windows了解不多,但也许这个小花絮会帮助其他人回答?
  • 在 audio_segment.py 中我更改了两个 p = subprocess.Popen(conversion_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 行,添加了 creationflags=0x08000000。这似乎是避免在这些调用中显示命令窗口的一种相当常见的方法,所以如果可能的话,也许值得将其放入 pydub 本身?

标签: windows ffmpeg pydub


【解决方案1】:

我使用的解决方案是重载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)`

【讨论】:

    【解决方案2】:

    我在任何使用 pydub 的脚本中执行以下操作:

    在导入pydub之前添加import subprocess

    然后,就在我在脚本中使用 pydub 之前,我添加:

    if subprocess.mswindows: subprocess.STARTUPINFO.dwFlags |= subprocess.STARTF_USESHOWWINDOW

    这告诉来自该脚本的任何子进程调用(无论是否通过 pydub 指令)默认情况下不显示窗口,而是查看另一个名为 wShowWindow 的标志来决定是否显示。由于该标志默认为 0,因此不显示窗口。

    【讨论】:

      【解决方案3】:

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

      # 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__())
      

      【讨论】:

        猜你喜欢
        • 2013-06-30
        • 2014-04-20
        • 2021-09-26
        • 2010-12-26
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        相关资源
        最近更新 更多