Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Python中MP3文件句柄的长度_Python_Mp3_Python Requests - Fatal编程技术网

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

获取Python中MP3文件句柄的长度,python,mp3,python-requests,Python,Mp3,Python Requests,我正在写一个Python程序。我需要一些东西来获取MP3文件的(音频)长度(以秒为单位,最好是),但关键是它是一个打开的文件句柄(确切地说是一个请求原始请求)。我可以将句柄保存到一个临时文件并从那里读取,但我想知道是否有更好的方法。(我必须处理大量文件,不想全部保存)如果您想从响应中获取文件。内容使用以下代码: import wave info = wave.open('test.wav', 'r') frames = info.getnframes() rate = info.getfram

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

如果您想从
响应中获取文件。内容使用以下代码:

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
当您说“长度”时,您是指音频播放时间还是文件的物理大小?
通过检查“内容长度”可获得文件的长度:

>>> 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-声音交换)的
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
能够理解的所有音频类型。

我需要音频长度。此外,我愿意将文件下载到RAM中,但我不想将其保存到文件系统中。此外,一些服务器不提供内容长度头。然后下载到/tmp(假设您运行的是Linux,如果不是您操作系统上的/tmp等价物),BytesIO就是我真正需要的(这也是为什么另一个可以处理图像的API不起作用的原因),谢谢!