在网站上查看音频文件的比特率而无需下载

3 投票
3 回答
2002 浏览
提问于 2025-04-21 08:59

我想在一个网站上找到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 个回答

0
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/

1
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这个可执行文件,然后把它添加到你的环境变量中。

补充:哎呀!抱歉,我没看完整个问题。

3

首先:

我不想下载文件。我只想从服务器上查看一下。我还想获取图片(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分支中添加的功能,因为之前没有办法做到这一点。

撰写回答