28

所以我有代码:

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 上获取歌曲的长度。有谁知道我的问题的解决方案?

4

5 回答 5

71

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

from mutagen.mp3 import MP3
audio = MP3("example.mp3")
print(audio.info.length)
于 2011-05-17T22:41:24.630 回答
12

您可以使用 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]
于 2015-03-12T08:21:52.777 回答
4

你也可以使用 eyed3 来获得它,如果这是你的口味,你可以这样做:

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

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

我不确定这比其他选项差多少,但如果您有可变比特率,请记住这一点。

于 2014-09-17T19:22:32.100 回答
3

较新版本python-ffmpegffprobe. 获取持续时间的示例如下:

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

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

于 2020-10-28T22:49:35.213 回答
0

也许也在Python中播放,即不要使用os.startfile,使用一些Python库来播放文件。

我最近写了这样一个库/模块,musicplayer模块(在 PyPI 上)。是一个简单的演示播放器,您可以轻松地为您的 shuffle 代码扩展它。

做吧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]
于 2012-11-10T16:24:28.597 回答