查找mp3文件的长度

时间:2011-05-17 22:18:31

标签: python 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)

但它所做的就是不停地播放所有歌曲。我想如果我能找到当前正在播放的歌曲的长度,我可以使用“时间”模块继续歌曲完成后使用(sleep)属性。但是,我找不到如何在Windows上获取歌曲的长度。有谁知道我的问题的解决方案?

5 个答案:

答案 0 :(得分:37)

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

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

答案 1 :(得分:6)

您可以使用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]

答案 2 :(得分:3)

你也可以使用eyed3来解决这个问题,如果你喜欢这样做的话:

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

但请注意,这会使用采样来确定曲目的长度。因此,如果它使用可变比特率,则样本可能无法代表整体,并且估计可能会有很大程度的偏差(我已经看到这些估计在法庭录音中偏差超过30%) )。

我不确定它比其他选项更糟糕,但如果你的比特率可变,那就要记住了。

答案 3 :(得分:1)

较新的python-ffmpeg版本具有ffprobe的包装函数。获取持续时间的示例如下:

import ffmpeg
print(ffmpeg.probe('in.mp4')['format']['duration']))

发现于:https://github.com/kkroening/ffmpeg-python/issues/57#issuecomment-361039924

答案 4 :(得分: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]