python - 如何正确计算 mp3 文件中的 ID3v2 标签大小?
问题描述
令我感到羞耻的是,我仍然不太了解字节算术和其他操作。我正在尝试从 mp3 文件中计算 ID3 标签的大小。版本 3 或 4,没有扩展标题。为简单起见,任何异常都会返回一个空列表。
from functools import reduce
def id3_size_calc(file_path):
try:
file_open = open(file_path, 'rb')
except Exception:
return print([])
with file_open:
id3_header = file_open.read(10)
if id3_header[0:3] != b'ID3':
return print([])
elif id3_header[3] != (3 or 4):
return print([])
elif id3_header[5] != 0:
return print([])
else:
size_encoded = bytearray(id3_header[-4:])
return print(reduce(lambda a, b: a * 128 + b, size_encoded, 0))
我找到了这段代码。
size = reduce(lambda a, b: a * 128 + b, size_encoded, 0)
但是,我不明白它是如何工作的。此外,我发现功能reduce已过时的信息。有没有更优雅的方法来计算这个标签的大小?
解决方案
最简单的方法是使用 ffmpeg/ffprobe
ffprobe -i file.mp3 -v debug 2>&1 | grep id3v2
应该给你这样的输出:id3v2 ver:4 flags:00 len:35
但是如果你不打算或没有使用 ffprobe 的包,这里有一段 python 来获取大小:
file_open = open('file.mp3', 'rb')
data = file_open.read(10)
file_open = open('fly.mp3', 'rb')
if data[0:3] != b'ID3':
print('No ID3 header present in file.')
else:
size_encoded = bytearray(data[-4:])
size = reduce(lambda a,b: a*128+b, size_encoded, 0)
print(size)
推荐阅读
- ios - Swift 4.2 自定义字体自动调整大小
- ruby-on-rails - 通过双重嵌套字段引用返回错误结果
- gcc - 为什么 snprintf/vsnprintf 在每次使用 %n 调用时都打开 /proc/self/maps?
- java - 如何在 Android Studio 上使用 Mikrotik API
- matlab - 如何在 MATLAB 中绘制二维元素网格的轮廓?
- amazon-web-services - 如何使用 2 个路径参数创建端点。AWS API 网关
- c# - EF Core 从具有多重性零或一的模型中获取实体的导航属性
- oracle - 如何在 PL/SQL (Oracle) 中发送电子邮件?
- angular - 基于 Angular 地图的应用程序的后端技术和架构
- symfony - 找不到条目“虚拟”...EntrypointLookup.php