获取mp3部分信息的python代码

Posted SDY_JS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取mp3部分信息的python代码相关的知识,希望对你有一定的参考价值。

import os,base64,struct
#这是python代码,用于获取mp3部分信息。
#编写者:SDY

#判断IDV2是否存在
def IDV2_exsist(mp3_file):
    b_data=mp3_file.read(3)
    a_data=b_data.decode('ASCII')
    if a_data=='ID3':
        return True
    else:        
        return False

#获取IDV2大小
def get_IDV_Size(mp3_file):
    mp3_file.seek(6)
    data=mp3_file.read(4)
    int_data=struct.unpack('>BBBB',data)
    all_size=int_data[0]*2*16**5+int_data[1]*4*4*16**2+int_data[2]*8*16+int_data[3]+10
    return all_size

#判断信息是否有价值
def judge_value(mp3_file,N):
    mp3_file.seek(N)
    value=mp3_file.read(4)
    if value==b'\\x00\\x00\\x00\\x00':
        return True
    else:
        return False

#获取数据种类
def get_type(mp3_file,N):
    mp3_file.seek(N)
    b_type=mp3_file.read(4)
    a_type=b_type.decode('ASCII')
    return a_type

#获取数据帧大小
def get_size(mp3_file,N):
    mp3_file.seek(N+4)
    b_size=mp3_file.read(4)
    number=struct.unpack('>BBBB',b_size)
    size=number[0]*16**8+number[1]*16**4+number[2]*16**2+number[3]+10
    return size

#获取数据编码方式
def get_code_style(mp3_file,N):
    mp3_file.seek(N+10)
    temp=mp3_file.read(1)
    temp=struct.unpack('>B',temp)
    if temp[0]==0:
        code_style='ISO-8859-1'
    elif temp[0]==1:
        code_style='UTF-16'
    elif temp[0]==2:
        code_style='UTF-16BE'
    elif temp[0]==3:
        code_style='UTF-8'
    return code_style

#获取具体信息
def get_message(mp3_file,code_style,N,size):
    mp3_file.seek(N+11)
    eb_data=mp3_file.read(size-11)
    ea_data=eb_data.decode(code_style)
    return ea_data

#获取mp3信息
def IDV2_GET_MESSAGE(mp3_file,file_name):
    ms_dic='TIT2':'未知','TPE1':'未知','TALB':'未知','TYER':'未知'
    global B
    B=0
    lis=['TIT2','TPE1','TALB','TYER']
    N,size=10,0
    if not IDV2_exsist(mp3_file):
        print('error')
        global A
        A=file_name
        B=1
    else:
        all_size=get_IDV_Size(mp3_file)
        while True:
            N=size+N
            if judge_value(mp3_file,N):
                break
            kind=get_type(mp3_file,N)
            size=get_size(mp3_file,N)
            if kind in lis:                
                code_style=get_code_style(mp3_file,N)
                message=get_message(mp3_file,code_style,N,size)
                ms_dic[kind]=message
    return ms_dic

#错误文件处理
def error_delete(error_list1,error_list2,delete_X,path):
    if delete_X=='Y':
        for file in os.listdir(path):
            if file in error_list1:
                file_path=path+'\\\\'+file
                print(f"delete file succeed.")
                os.remove(file_path)
            if file in error_list2:
                file_path=path+'\\\\'+file
                print(f"file delete successfully.")
                os.remove(file_path)

#主函数
print('TLT2:标题,TPE1:作者,TALB:专辑,TYER:年代')
n,m,mn=0,0,0
error_list1=[]
error_list2=[]
#文件路径获取
path='F:\\\\Temp'
for file in os.listdir(path):
    address=path+'\\\\'+file 
    mp3_file=open(address,'rb')
    try:        
        dic=IDV2_GET_MESSAGE(mp3_file,file)
    except:
        error_list2.append(file)
    else:
            a1=dic['TIT2']
            a2=dic['TPE1']
            a3=dic['TALB']
            a4=dic['TYER']
            value=a1+','+a2+','+a3+','+a4+','+address
            print(value)
            n+=1
    m+=1
    if B==1:
        error_list1.append(A)
        B=0
        mn+=1
    mp3_file.close()    
print(f'成功录入 n 首;共 m 首 ')
if error_list1:
    print('以下歌曲不存在IDV2标签:')
    print(error_list1)
if error_list2:
    print('以下歌曲解析失败:')
    print(error_list2)
if error_list1 or error_list2:
    delete_X=input('如果你想删除有问题的歌曲,请输入 Y :')
    error_delete(error_list1,error_list2,delete_X,path)

os.system('pause')

symbian V3 如何从 MP3 文件中获取 id3 信息

【中文标题】symbian V3 如何从 MP3 文件中获取 id3 信息【英文标题】:How symbian V3 get id3 info from a MP3 file 【发布时间】:2011-08-05 07:39:55 【问题描述】:

我正在 Symbian v3 上编写音乐播放器。但我找不到如何从 mp3 文件中获取 id3 信息。是否有任何 API 可以做到这一点?我该如何使用它?

【问题讨论】:

【参考方案1】:

您可以使用 CMetaDataUtility API 从 MP3 获取 ID3 数据。它不是公共 SDK 的一部分,但您可以通过此 Nokia Developer 页面下载 SDK API 插件,该页面也有示例代码。

这适用于 S60 第 3 版、第 5 版和 Symbian^3。

【讨论】:

以上是关于获取mp3部分信息的python代码的主要内容,如果未能解决你的问题,请参考以下文章

Python实现mp3 ID3v2.3信息提取

使用 python 从 mp3 音频文件中获取幅度数据

Python-从MP3文件获取id3

如何使用python获取mp3文件的采样率

以编程方式操作 MP3:静音某些部分?

是否有用于从 mp3 读取 ID3 信息的非 GPL Python 库? [关闭]