获取Python中MP3文件句柄的长度

时间:2015-11-22 08:43:35

标签: python mp3 python-requests

我正在编写一个Python程序。我需要一些东西来获得MP3文件的(音频)长度(最好是几秒钟),但问题是它是一个打开的文件句柄(确切地说是一个requests原始请求)。我可以将句柄保存到临时文件并从那里读取,但我想知道是否有更好的方法。 (我必须处理大量文件,并且不想全部保存它们)

2 个答案:

答案 0 :(得分:0)

如果您想从response.content获取文件,请使用以下代码

import wave

info = wave.open('test.wav', 'r')
frames = info.getnframes()
rate = info.getframerate()
duration = frames / float(rate)  

print duration

import wave
import io
import requests


url = "http://localhost/test.wav"
r = requests.get(url)
#To get a file like object from r.content we use "io.BytesIO"
infofile = wave.open(io.BytesIO(r.content), 'r')
frames = infofile.getnframes()
rate = infofile.getframerate()
duration = frames / float(rate)  

print duration

答案 1 :(得分:0)

当你说"长度"你的意思是音频播放时间或文件的物理尺寸? 通过检查内容长度'

,可以获得文件的长度
>>> import requests
>>> r = requests.get('http://localhost/postcard/vp1.mp3', stream=True)
>>> print r.headers
CaseInsensitiveDict({'content-length': '3119672', 'accept-ranges': 'bytes', 'server': 'Apache/2.4.7 (Ubuntu)', 'last-modified': 'Fri, 19 Jun 2015 13:18:08 GMT', 'etag': '"2f9a38-518dec14f8cf5"', 'date': 'Sun, 22 Nov 2015 10:20:07 GMT', 'content-type': 'audio/mpeg'})

对于音频长度,我怀疑您必须先下载该文件,然后才能确定其运行时间。

编辑:
首先使用apt或synaptic(sox - Sound eXchange)安装sox包 然后代码如下:

import os, requests
url = "http://localhost/postcard/vp1.mp3"
pre,suff = url.rsplit('.')
r = requests.get(url)
with open('/tmp/tmp.'+suff, 'wb') as f:
    for chunk in r.iter_content(1024000):
        f.write(chunk)
stats=os.popen('soxi /tmp/tmp.'+suff).readlines()
for info in stats:
    print info.strip()

输出:

Input File     : '/tmp/tmp.mp3'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:02:57.08 = 7809404 samples = 13281.3 CDDA sectors
File Size      : 3.12M
Bit Rate       : 141k
Sample Encoding: MPEG audio (layer I, II or III)
Comments       :
Title=Smoke Gets in Your Eyes
Artist=Bryan Ferry
Album=More Than This: The Best of Bryan Ferry + Roxy Music
Tracknumber=6/20
Discnumber=1

使用soxi是一种欺骗,但我没有时间安装pysox软件包,这可能会对工作造成影响。
这不仅适用于wav文件,也适用于sox理解的所有音频类型。