【问题标题】:How to calculate the ID3v2 tag size from mp3 file correctly?如何正确计算 mp3 文件中的 ID3v2 标签大小?
【发布时间】:2021-11-19 13:22:46
【问题描述】:

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

ID3 description

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

【问题讨论】:

    标签: python mp3 reduce id3-tag


    【解决方案1】:

    最简单的方法是使用 ffmpeg/ffprobe

    ffprobe -i file.mp3 -v debug 2>&1 | grep id3v2 应该给你这样的输出:id3v2 ver:4 flags:00 len:35

    但是如果你不打算或没有使用ffprobe的包,这里有一个python的sn-p来获取大小:

    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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多