在网站上查看音频文件的比特率而无需下载
我想在一个网站上找到mp3文件的比特率,而不需要下载这个文件。这里用的是Python3和Mutagen的移植版本。
代码
from mutagen.id3 import ID3
audio = ID3("http://songs.djmazadownload.com/music/indian_movies/Creature%20(2014)/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3")
print (audio.info.length, audio.info.bitrate)
错误
Traceback (most recent call last):
File "C:\Python_Mass_downloader\New folder\download.py", line 20, in <module>
audio = ID3("http://songs.djmazadownload.com/music/indian_movies/Creature%20(2014)/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3")
File "C:\Python34\lib\site-packages\mutagen\id3.py", line 76, in __init__
super(ID3, self).__init__(*args, **kwargs)
File "C:\Python34\lib\site-packages\mutagen\_util.py", line 41, in __init__
super(DictProxy, self).__init__(*args, **kwargs)
File "C:\Python34\lib\site-packages\mutagen\__init__.py", line 46, in __init__
self.load(*args, **kwargs)
File "C:\Python34\lib\site-packages\mutagen\id3.py", line 122, in load
self._fileobj = open(filename, 'rb')
OSError: [Errno 22] Invalid argument: 'http://songs.djmazadownload.com/music/indian_movies/Creature%20(2014)/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3'
示例输入
http://songs.djmazadownload.com/music/indian_movies/Creature%20%282014%29/01%20-%20Creature%20-%20Sawan%20Aaya%20Hai%20%5BDJMaza.Info%5D.mp3
如果有其他方法也欢迎分享哦 :) 谢谢!
3 个回答
from pymediainfo import MediaInfo
media_info = MediaInfo.parse(AudioFile)
for track in media_info.tracks:
if track.track_type == 'Audio':
print(str(track.bit_rate/1000) + 'Kbps')
从这个链接下载 pymediainfo: https://pypi.org/project/pymediainfo/
Info = MediaInfo.parse(mp3file)
for track in Info.tracks:
if track.track_type == 'General':
pass
if track.track_type == 'Audio':
BitRate = track.bit_rate/1000 + 'Kbps'
下载MediaInfo这个可执行文件,然后把它添加到你的环境变量中。
补充:哎呀!抱歉,我没看完整个问题。
首先:
我不想下载文件。我只想从服务器上查看一下。我还想获取图片(jpg、png等)的信息,比如大小、像素。这可能吗?
不,这不可能。获取这些信息的唯一方法是解析文件数据,而你必须先下载文件数据才能解析。
当然,如果服务器以其他方式提供这些信息,比如通过REST或RPC API,或者是你可以抓取的网页,那么你就可以下载这些信息……但在这种情况下,你并不是自己解析文件,而是通过其他方式获取信息,这样就不需要用到Mutagen了。(如果你控制服务器,你可以添加一个网页应用程序,在服务器端进行解析,并以你想要的格式提供信息。)
如果你只是担心把文件保存到磁盘:无论是使用标准库还是第三方模块,Python中大多数需要文件名的函数都不能接受网络URL。这和其他一些语言不同,那些语言可以在很多地方使用URL,并尽可能把http和文件URL当作同样的东西来处理(通过将文件分块下载到内存中)。
不过,大多数需要文件对象的函数可以接受urlrequest
或类似的对象,如果不能,通常也可以接受BytesIO
。所以,你不需要把它下载到磁盘上的文件:
import urllib.request
r = urllib.request.open(url)
spam(r)
问题是,我觉得Mutagen的“简单API”像ID3
这样的函数只能接受文件名,而不能接受文件对象。所以,你要么使用其他库,要么使用更底层的函数,*或者下载到一个临时文件。
但即使是最后一种方法也并不是那么糟糕:
import tempfile
import urllib.request
r = urllib.request.open(url)
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as f:
f.write(r.read())
try:
id3 = mutagen.id3.ID3(f.name)
finally:
os.remove(f.name)
或者,如果你不在乎Windows,你可以简化为:
r = urllib.request.open(url)
with tempfile.NamedTemporaryFile(mode='wb') as f:
f.write(r.read())
f.flush()
id3 = mutagen.id3.ID3(f.name)
NamedTemporaryFile
会创建并打开一个临时文件。默认情况下,它会在你关闭它后立即被删除(这发生在with
语句结束时)。以这种方式使用它的问题是,在Windows上,ID3
可能无法在你关闭临时文件之前打开它,这意味着你必须在构造函数中传递delete=False
,然后再显式地os.remove
它。虽然有点麻烦,但这是我知道的在所有平台上安全且稳健的写法。(再次强调,如果你不在乎Windows,就直接使用更简单的第二种版本。)
如果你不理解with
语句,PEP 343可能解释得最好,但简单来说,这个语句的意思是运行所有缩进的代码,然后自动关闭文件(即使你在缩进代码中间return
或抛出异常)。
从HTTP服务器上你可以获取的少数信息之一是文件的大小。服务器通常会为每个响应发送一个Content-Length:
头,如果你发送HEAD
请求而不是GET
,你只会得到头信息,而不是所有数据。所以:
>>> req = urllib.request.Request(url, method='HEAD')
>>> resp = urllib.request.urlopen(req)
>>> size = int(resp.headers['Content-Length'])
6201098
* 实际上,我甚至不确定“使用更底层的函数”是否是一个选项;我记不清了,但我认为能够用打开的文件对象或字符串代替文件名是MusicBrainz在他们的Mutagen分支中添加的功能,因为之前没有办法做到这一点。