这是一个简单的脚本,只是为了说明问题。该脚本应该播放任何可以用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参数。但是我不明白它是如何解决这个问题的。
你有什么想法吗?