2017-09-22 13 views
1

我有以下用于播放给定文件夹中音乐的代码。 的问题是:Porgram无法打开文件无法打开目录中的音频文件

import os 
import pygame 


def playsound(soundfile): 
    """Play sound through default mixer channel in blocking manner. 
     This will load the whole sound into memory before playback 
    """ 
    pygame.init() 
    pygame.mixer.init() 
    sound = pygame.mixer.Sound(soundfile) 
    clock = pygame.time.Clock() 
    sound.play() 
    print("Playing...") 
    while pygame.mixer.get_busy(): 

     clock.tick(1000) 


def playmusic(soundfile): 
    """Stream music with mixer.music module in blocking manner. 
     This will stream the sound from disk while playing. 
    """ 
    pygame.init() 
    pygame.mixer.init() 
    clock = pygame.time.Clock() 
    pygame.mixer.music.load(soundfile) 
    pygame.mixer.music.play() 
    print("Playing...") 
    while pygame.mixer.music.get_busy(): 
     clock.tick(1000) 


def stopmusic(): 
    """stop currently playing music""" 
    pygame.mixer.music.stop() 


def getmixerargs(): 
    pygame.mixer.init() 
    freq, size, chan = pygame.mixer.get_init() 
    return freq, size, chan 


def initMixer(): 
    BUFFER = 3072 # audio buffer size, number of samples since pygame 1.8. 
    FREQ, SIZE, CHAN = getmixerargs() 
    pygame.mixer.init(FREQ, SIZE, CHAN, BUFFER) 


try: 
    initMixer() 

    for file in os.listdir("./music/"): 
     if file.endswith(".mp3"): 
      filename = file 

      playmusic(filename) 

except KeyboardInterrupt: # to stop playing, press "ctrl-c" 
    stopmusic() 
    print ("\nPlay Stopped by user") 

它给了我以下错误:

pygame.error: Couldn't open '1.mp3' 

当我删除了for循环尝试块写文件名= “music/1.mp3”程序运行时没有问题。错误引用导致playmusic(filename)pygame.mixer.music.load(soundfile)。但我无法弄清楚我在这里做错了什么。 有人吗?

回答

2

os.listdir()不会为您提供文件的完整路径,因此它不会包含路径的./music/部分。你可以简单地将线更改为:

filename = "./music/" + file 
playmusic(filename) 

甚至更​​好,使用os.path避免古怪行为

编辑:这实际上是一个很大的用例水珠!您可以使用通配符来抓取音乐文件夹中的所有mp3文件。 Glob还会返回文件的完整路径(./music/song1.mp3),而不是原始文件名(song1.mp3)。

from glob import glob 

filenames = glob('./music/*.mp3') 
for filename in filenames: 
    playmusic(filename) 

编辑2:要播放随机播放歌曲,而不是所有的人:

from glob import glob 
import random 

filenames = glob('./music/*.mp3') 
playmusic(random.choice(filenames)) 
+1

感谢。它适用于这两种解决方案。 你能帮助多一点吗? 如何从目录中选择一个随机文件? 通过传递playmusic(随机(文件名))? –

+0

很高兴 - 如果您想播放随机文件而不是所有文件,请使用我添加到第二次编辑的代码 – jfbeltran

+0

竖起大拇指。现在工作正常。 –

相关问题