2011-05-17 67 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]