mplayer在尝试通过python子进程模块播放文件时冻结

时间:2017-08-24 15:47:54

标签: python subprocess

这是一个简单的脚本,只是为了说明问题。该脚本应该播放任何可以用mplayer播放的视频和音频文件。

import sys
import time
import subprocess


def get_sound_duration(file_to_play):
    ffprobe = ["ffprobe", "-v", "error", 
               "-show_entries", "format=duration", "-of", 
               "default=noprint_wrappers=1:nokey=1", file_to_play]
    duration = subprocess.Popen(ffprobe,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.STDOUT)
    return duration.stdout.readlines()[0].strip()


def play(player=sys.argv[1], file_to_play=sys.argv[2]):
    proc = subprocess.Popen([player, file_to_play],
                            stdout=subprocess.PIPE)
        time.sleep(float(get_sound_duration(file_to_play)))
        proc.terminate()
        proc.wait()


if __name__ == "__main__":
    play()

问题在于,当我用mplayer运行它时如下:

$ python play.py mplayer PATH_TO_FILE

它在不到一分钟的时间内挂起。在我测试过这个脚本的所有玩家中,这个问题只发生在mplayer和mpv(基于mplayer,所以粗略地讲,它是一样的)。 我找到了解决问题的方法,但我对修复并不满意。要修复它,我只需要从Popen函数中的play构造函数中取出stderr参数。但是我不明白它是如何解决这个问题的。 你有什么想法吗?

0 个答案:

没有答案