在GUI应用程序中运行YoutubeDL时隐藏ffmpeg的控制台窗口

时间:2016-06-15 13:04:56

标签: python ffmpeg youtube-dl

我正在开发一个可以下载YouTube视频的基本应用程序。在整个开发过程中,我有几个怪癖,包括格式问题。

我决定使用一种希望万无一失的格式语法,youtube-dl几乎无论如何都会为我下载。

我的部分YoutubeDL选项如下所示:

self.ydl_opts = {
    'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best',
    'quiet': True,
    'progress_hooks': [self.ydl_progress],
    'outtmpl': None
}

稍后在用户选择输出文件夹时插入outtmpl。

由于我正在使用此格式字符串,因此youtube-dl使用ffmpeg合并(?)音频和视频(如果它们是单独下载的。)

当它这样做时,它会打开非常恼人的控制台窗口,捕捉焦点并中断我在视频下载时可能正在做的其他事情。

我的问题是,如何防止ffmpeg或youtube-dl创建出现的控制台窗口,又名。我该如何隐藏它们?

修改

我将提供再现问题的裸骨脚本:

from __future__ import unicode_literals
from PyQt4 import QtGui, QtCore
import youtube_dl, sys

def on_progress(info):
    print info.get("_percent_str", "Finished")

ydl_opts = {
    'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best',
    'progress_hooks': [on_progress],
    'quiet': True,
    'outtmpl': "C:/Users/Raketa/Desktop/%(title)s.%(ext)s"
}

ydl = youtube_dl.YoutubeDL(ydl_opts)

class DownloadThread(QtCore.QThread):
    def __init__(self):
        super(DownloadThread, self).__init__()
        self.start()

    def __del__(self):
        self.wait()

    def run(self):
        print "Download start"
        ydl.download(["https://www.youtube.com/watch?v=uy7BiiOI_No"])
        print "Download end"

class Application(QtGui.QMainWindow):
    def __init__(self):
        super(Application, self).__init__()
        self.dl_thread = DownloadThread()

    def run(self):
        self.show()

def main():
    master = QtGui.QApplication(sys.argv)

    app = Application()
    app.run()

    sys.exit(master.exec_())

if __name__ == '__main__':
    main()
每次下载开始时都会出现2个(?)控制台,下载视频和音频时会出现1个更长的控制台。下载较长的视频时,最后一个控制台变得无法忍受。

有可能摆脱那些吗?

1 个答案:

答案 0 :(得分:1)

问题与代码无关。事实上,它更像是一个“窗户问题”。如果我在我的计算机上运行代码(这是一个linux),没有问题。只有一个控制台(我用来启动脚本的控制台)。

我认为如果您使用.pyw重命名该文件,它将起作用。根据该链接:How to hide console window in python?

  

在Windows系统上,没有“可执行模式”的概念。 Python安装程序会自动将.py文件与python.exe相关联,这样双击Python文件就会将其作为脚本运行。扩展名也可以是.pyw,在这种情况下,通常出现的控制台窗口会被抑制。

这将解决您的问题

(如果没有,也许你可以在控制台中运行代码(而不是双击文件浏览器)来查看问题的来源并给我一些反馈:))