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