1

令我感到羞耻的是,我仍然不太了解字节算术和其他操作。我正在尝试从 mp3 文件中计算 ID3 标签的大小。版本 3 或 4,没有扩展标题。为简单起见,任何异常都会返回一个空列表。

ID3 说明

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已过时的信息。有没有更优雅的方法来计算这个标签的大小?

4

1 回答 1

0

最简单的方法是使用 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)
于 2022-01-24T21:16:41.560 回答