【问题标题】:Finding the length of an mp3 file查找 mp3 文件的长度
【发布时间】:2011-08-27 15:02:00
【问题描述】:

所以我有代码:

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

【问题讨论】:

  • 您的问题标题令人困惑。也许这是随机播放音乐播放器的一部分,但您的问题是查找 mp3 歌曲的长度。此外,您的变量名称(aw、aww、awww)可能更具描述性;-)

标签: python mp3 duration


【解决方案1】:

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

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

【讨论】:

  • @salks:应该。将归档文件cd 解压缩到目录中,然后从命令行运行python setup.py install。
  • RuntimeWarning: 找不到 ffmpeg 或 avconv - 默认为 ffmpeg,但可能无法工作 warn("找不到 ffmpeg 或 avconv - 默认为 ffmpeg,但可能无法工作", RuntimeWarning) (最后一次调用):文件“E:\PythonProjects\testfile.py”,第 11 行,在 print(file.info.length) AttributeError: 'str' object has no attribute 'info'
【解决方案2】:

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

【讨论】:

  • 对于 10 小时长的 mp3 文件,ffprobe 返回的结果不准确。我不得不改用诱变剂。
  • @jippyjoe4:出于兴趣,他们离我们有多远?秒?分钟?比这更糟糕?
【解决方案3】:

您也可以使用 eyed3 获得此功能,如果您喜欢这样做:

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      也许也可以在 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]
      

      【讨论】:

        猜你喜欢
        • 2010-11-03
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多