2011-05-17 68 views
6

所以我的代码:找到一个MP3的长度的文件

import glob,os 
import random 


path = 'C:\\Music\\' 
aw=[] 
for infile in glob.glob(os.path.join(path,'*.mp3')): 
    libr = infile.split('Downloaded',1) 



    aw.append(infile) 
aww = -1 
while 1: 
    aww += 1 
    print len(aw),aww 

    random.shuffle(aw) 
    awww = aw[aww] 
    os.startfile(awww) 

,但它是所有经过的所有歌曲没有停止。我想如果我能找到当前正在播放的歌曲的长度,我可以使用“时间”模块在歌曲与(睡眠)属性完成后继续前进。但是,我无法找到如何在Windows上获得歌曲的长度。有谁知道我的问题的解决方案?

+2

你的问题的标题是混乱的。也许这是一个洗牌音乐播放器的一部分,但你的问题是找到一首mp3歌曲的长度。另外,你的变量名('aw','aww','awww')可能更具描述性;-) – Gregg 2011-05-17 22:48:54

回答

23

您可以使用mutagen来获取歌曲的长度(见tutorial):

from mutagen.mp3 import MP3 
audio = MP3("example.mp3") 
print audio.info.length 
+1

这是否也适用于Windows 7? – 2011-05-17 23:14:40

+2

@salks:应该的。将存档文件“cd”解压缩到目录中,然后从命令行运行“python setup.py install”。 – Gregg 2011-05-17 23:36:48

+1

这适用于windows7/py3 – fastmultiplication 2016-10-07 22:25:07

0

也许做游戏也是Python的范围内,即不使用os.startfile,使用一些Python库打文件。

我最近写了这样一个库/模块,musicplayer模块(on PyPI)。 Here是一个简单的演示播放器,您可以轻松扩展您的随机播放代码。

只是做easy_install musicplayer。于是,这里是一些示例代码来获取长度:

class Song: 
    def __init__(self, fn): 
     self.f = open(fn) 
    def readPacket(self, bufSize): 
     return self.f.read(bufSize) 
    def seekRaw(self, offset, whence): 
     self.f.seek(offset, whence) 
     return self.f.tell() 

import musicplayer as mp 

songLenViaMetadata = mp.getMetadata(Song(filename)).get("duration", None) 
songLenViaAnalyzing = mp.calcReplayGain(Song(filename))[0] 
+0

链接已死亡。 – obayhan 2014-11-02 16:35:57

+0

@obayhan:固定。 – Albert 2014-11-03 14:44:28

1

你也可以得到这个使用eyed3,如果这是你的味道做:

import eyed3 
duration = eyed3.load('path_to_your_file.mp3').info.time_secs 

不过请注意,这里使用的采样,以确定轨道的长度。因此,如果它使用可变比特率,那么样本可能不能代表整体,估计可能会有很大程度的偏离(我看到这些估计值在法庭录音中偏离了30%以上)。

我不确定这比其他选项差得多,但是如果您有可变比特率则需要记住。

4

您可以使用FFMPEG库:

args=("ffprobe","-show_entries", "format=duration","-i",filename) 
    popen = subprocess.Popen(args, stdout = subprocess.PIPE) 
    popen.wait() 
    output = popen.stdout.read() 

和输出将是:

[FORMAT] 
duration=228.200515 
[/FORMAT]