mp3 file format

MP3文件结构及解码概述 Layer-3 音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和6:1-8:1,而MP 阅读详情


MP3文件大体分为三部分:

TAG_V2(ID3V2),

音频数据,

TAG_V1(ID3V1),

其中ID3V2是ID3V1的补充,并不是所有的MP3都有ID3V2补充,即是不是所有的MP3文件都有ID3V2。


如果MP3文件存在ID3V2,则一定在文件的头部,ID3V2结构分为头部(header)和若干标签帧,其中头部长度为10字节,10个字节的结构如表1:

0

1

2

3

4

5

6

7

8

9

内容为”ID3”

版本号

副版本号

存放标志的字节

ID3V2总大小(帧头和之后的若干标签帧总和)


判断MP3文件是否存在ID3V2,只需要判断文件前三个字节是否是”ID3”.


读取MP3文件ID3V2信息的函数可如下:

//定义头部和标签帧

typedefstruct ID3v2Header{

   char Identify[3];         // ID3v2固定标志:ID3

   char Ver;              //主版本号,ID3v2就是3

   char Rever;            //副版本号,一般都为0

   char Flag;             //标志位,一般为0,字义为abc00000

   char Size[4];             //标签大小,一共四个字节,但每个字节只使用7位,最高位不使用恒为0,所以格式: 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

}ID3v2Header;

 

shell.albert@yantai:~/temporary/build-ZAudioTest-Desktop_Qt_5_3_GCC_64bit-Debug> hexdump  -C test.mp3 | head -n 2
00000000  49 44 33 03 00 00 00 00  1f 76 54 50 45 31 00 00  |ID3......vTPE1..|
00000010  00 1d 00 00 01 ff fe 53  00 65 00 63 00 72 00 65  |.......S.e.c.r.e|


typedefstruct ID3v2Frame//标签帧,10个字节

{

   char FrameID[4];          //标志对照符,如TEXT,TOPE,TDAT....

   char Size[4];             //帧体的大小,按照正常的8位存储的,FSize = Size[0]*0x100000000 + Size[1]*0x10000 + Size[2]*0x100 + Size[3];

   char Flag[2];             //存放标志

}ID3v2Frame;

 

//输出信息并返回ID3V2大小

int ReadID3v2(FILE *pf)

{

   ID3v2Headermp3header;

   ID3v2Frame mp3Frame;

   int FSize      = 0;

   char str[4096] = {0};

   char str2[5]   = {0};

   int ID3size;

   inthead_size = 0;

   inti;

   if(!pf)

       return -1;

   fseek(pf,0,SEEK_SET);

 读取mp3的头部分信息

   fread(&mp3header,sizeof(mp3header),1,pf);

   if (mp3header.Identify[0]!='I' || mp3header.Identify[1]!='D' || mp3header.Identify[2]!='3' ){

       printf("此歌曲不支持ID3v2标准!\n");

       //文件复位

       rewind(pf);

       return -2;

   }

   printf("ID3v2标志:%.3s\n",mp3header.Identify);

   printf("ID3v2版本:%d\n",  mp3header.Ver);

   ID3size= (mp3header.Size[0]& 0x7F)<< 21|(mp3header.Size[1]& 0x7F)<< 14|(mp3header.Size[2] & 0x7F) << 7|(mp3header.Size[3] & 0x7F);

   printf("标签大小:%d\n***********\n",ID3size);

   for (i=0;i<ID3size;i=i+11+FSize){

       memset(&mp3Frame,0,sizeof(mp3Frame));

       memset(&str,0,sizeof(str));

       fseek(pf,10+i,SEEK_SET);               //移动到标签帧头

       fread(&mp3Frame,sizeof(mp3Frame),1,pf);

       //原则上是不用-1的,但是实际发现,总有一个字节的差距,为了计算方便-1,所以出现-1时标明此区块无内容

       FSize  = (int)(mp3Frame.Size[0]*0x100000000 + mp3Frame.Size[1]*0x10000+ mp3Frame.Size[2]*0x100 + mp3Frame.Size[3]-1);

       if (FSize>0)   {

           fseek(pf,10+11+i,SEEK_SET);//移动到内容区           

           fread(str,FSize,1,pf);

           GetStr(mp3Frame.FrameID,str2);

           printf("%s-%s:\t%s\n",str2,mp3Frame.FrameID,str);

           head_size+=11;

       }else{

           return ID3size+10;

       }

   }

   return ID3size+10;

}

 

//通过FrameID获取对应的中文名

void GetStr(char* oldstr,char* str)

{

   if (0==memcmp((LPCTSTR)"TIT2",oldstr,4))

   {

       memcpy(str,"标题",4);

   }elseif(0==memcmp((LPCTSTR)"TPE1",oldstr,4)){

       memcpy(str,"作者",4);

   }elseif(0==memcmp((LPCTSTR)"TALB",oldstr,4)){

       memcpy(str,"专辑",4);

   }elseif(0==memcmp((LPCTSTR)"TRCK",oldstr,4)){

       memcpy(str,"音轨",4);

   }elseif(0==memcmp((LPCTSTR)"TYER",oldstr,4)){

       memcpy(str,"年代",4);

   }elseif(0==memcmp((LPCTSTR)"COMM",oldstr,4)){

       memcpy(str,"备注",4);

   }elseif(0==memcmp((LPCTSTR)"TCON",oldstr,4)){

       memcpy(str,"类型",4);

   }else{

       memcpy(str,"未知",4);  //其他的不是很重要,所以省略了

   }

}


Linux声卡录音程序之——mp3(通过ALS… 此程序通过ALSA打开声卡设备,和从声卡读取数据,避免直接操作声卡。由于不同主机,不同声卡的名字可能不一样,直接通过设备名操作声卡有局限性,故改进成通过ALSA操作。 #include "lame.h" #include #include #include #include #include //#include //#include #include //#include 阅读详情

相关推荐

C++调用libmp3lame实现压缩WAV为MP3【附VS2013项目】

The LAME Project LAME is a high quality MPEG Audio Layer III (MP3) encoder licensed under the LGPL.  VS2013项目(libmp3lame, 可直接编译)下载链接:http://pan.baidu.com/s/1eQnqS9c 密码:5mg3 /********************

Rprop 1万+

【Audio】MP3音频文件格式结构解析

网上找了一圈,自己做一个总结;方便自己查询~ https://www.cnblogs.com/ranson7zop/p/7655474.html https://blog.youkuaiyun.com/fulinwsuafcie/article/details/8972346 https://blog.youkuaiyun.com/xiahouzuoxin/article/details/7849249 整个MP3 文件...

Sam-zhang的博客 5531

wav转mp3 c语言源码,C/C++知识点之mp3格式转wav格式 附完整C++算法实现代码

autoconstepoch=clock();staticdoublenow(){return(clock()-epoch);};templatestaticdoublebench(constFN&fn){autotook=-now();return(fn(),took+now())/1000;}//写wav文件voidwavWrite_i...

weixin_39632291的博客 1315

Mp3文件结构全解析(一)

MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3的全称应为MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3, 且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。

轻口味的专栏 4048

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2865

flowable表中文注释-表结构-主要表结构字段注释-sql脚本

flowable表结构中文注释,主要表结构字段注释,sql执行脚本,包含MySQL版和Oracle版sql脚本。

bushinakeshu的博客 1068

MP3 File Format Specification

<br />MP3文件格式说明书,英文原版。<br />MPEG Audio Layer I/II/III frame header<br /><br />http://www.mpgedit.org/mpgedit/mpeg_format/MP3Format.html

蓝蓝的天 2596

MiniMax H3本地部署实战:ComfyUI整合包安装与提速插件验证指南

在AIGC工具链快速演进的当下,本地部署内容生成模型成为许多创作者和开发者的关注焦点。本地部署意味着数据不出本机、可按需定制工作流,还能规避云端排队与外部依赖,其核心价值在于为内容生产提供可控、私密且可编程的生成环境。ComfyUI作为模块化节点式AI绘画工具,凭借灵活的工作流编排和API接口能力,成为承载这类模型的热门平台。MiniMax H3作为支持文本、参考图等多种输入的内容生成模型,与ComfyUI结合后,既适合个人进行概念验证,也能用于团队私有化流程搭建。实际落地过程中,中文整合包显著降低了环境配

weixin_29042035的博客 293

php文件mp3,解析MP3等媒体文件的超强php类-getid3

getID3()是一款从MP3等媒体文件中提取文件信息的php类,既可以提取也能修改文件的标签信息。它能读取的文件类型非常多,例如MP3、wav、midi等,这里就不一一列举了,详细版本和可读取的文件类型可以参考官方网站http://getid3.sourceforge.net/这里举一个获取mp3文件信息的例子include "library/getid3/getid3.php"; //引入...

weixin_42298081的博客 575

STM32F407硬件SPI驱动ADS1220避坑指南:从寄存器读不到数据到采样值异常的完整解决流程

本文详细解析了STM32F407硬件SPI驱动ADS1220的常见问题与解决方案,包括SPI配置、寄存器读取异常、采样值优化等关键环节。通过CubeMX配置技巧和Keil调试经验,帮助开发者快速排查从通信失败到数据异常的各种问题,实现高精度数据采集系统的稳定运行。

weixin_26878995的博客 157

Revit Dynamo实战:用Excel数据批量生成桥梁模型(附自适应族技巧)

本文详细介绍了如何利用Revit Dynamo结合Excel数据实现桥梁参数化建模,重点讲解了数据驱动建模、自适应族优化及大型项目性能管理三大核心技巧。通过结构化Excel数据、高级自适应族创建和分块处理策略,显著提升桥梁建模效率与设计变更响应能力。

weixin_42520025的博客 386

RuntimeError: Error opening ‘Any song.mp3‘: File contains data in an unknown format.

During handling of the above exception, another exception occurred: raise NoBackendError() audioread.exceptions.NoBackendError 解决方案: 下载ImageMagick choose----ffmpeg 解决OK

m0_58272896的博客 2185

【Windows Server 2019】Active Directory Certificate Services 证书颁发机构的安装,配置和管理Ⅰ——AD CS的安装和配置

博文主要介绍了Windows Server 2019的证书颁发机构的安装和配置方法。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 4832

python 使用pydub将mp3流转为pcm代码

你可以使用Python中的pydub库来将MP3流转换为PCM代码。要使用pydub,你需要安装ffmpeg,然后你可以轻松访问pydub的API,如下所示: audio_file = AudioSegment.from_mp3("file.mp3") pcm_data = audio_file.export("file.pcm", format="s16le", codec="pcm_s16le...

weixin_42591908的博客 1207

零基础学GPU KMD--8. 内存管理:GPU 显存与系统内存的协同​8.1 显存分配策略:GEM / TTM 原理

支持 VRAM、GTT(Graphics Translation Table)、SYSTEM 内存的动态迁移与缓存管理。:若缓冲区在 SYSTEM,TTM 分配 GTT 条目并建立页表映射,使 GPU 可直接访问。:系统内存中预留给 GPU 直接访问的区域,通过 GPU 的 MMU 做地址翻译。你需要我继续展开这一部分吗?​ 为复杂离散 GPU 设计,应对大容量 VRAM、多内存域、显存迁移等问题。:重量级、功能全,适合大容量、多内存域的离散 GPU,强调显存迁移与统一管理。

amy_mhd的博客 185

ArcGIS实验教程——实验二十五:大型商场选址经典案例

本实验基于ArcGIS平台进行商场选址分析,综合考虑道路、居民点、停车场和已有商场四个影响因素。通过缓冲区分析建立各要素的影响范围(道路50米、居民点100米、停车场100米、已有商场500米),采用叠加分析中的相交和擦除运算确定最优选址区域。实验建立了区位评价体系,通过属性赋值(1/-1)和联合运算生成综合评价结果,并实现分级可视化显示。注意事项包括距离参数设置对结果的影响以及正确选择空间分析工具。该流程为商业选址提供了科学的GIS解决方案。

智慧空间实验室 1万+

报错与解决 | RuntimeError: Error opening File contains data in an unknown format.

文章目录问题描述报错原因解决方法1、下载ffmpg2、把`ffmpeg.exe`复制到项目文件夹3、打开anaconda中项目所在位置的“ffdec.py” 问题描述 总结一下: 报了俩错误: 1、RuntimeError: Error opening File contains data in an unknown format. 2、NoBackendError 报错原因 无法识别MP3格式的文件, 换言之:没有安装ffmpeg 解决方法 1、下载ffmpg ffmpeg安装教程 安装完成的结果显示

qq_44250700的博客 3185

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pygame加载中文名mp3文件出现error

     好一阵子没有写东西了,最近几天在做一个基于Python pygame的音乐播放器,本来想做完了,再来发篇文章的,可越做越深,框架大致出来了,考虑周期比较长,也可能是我个人问题,做得比较慢.下面来谈谈pygame.mixer.music.load()加载中文名的mp3文件问题. (发表时间2017-03-3022:45:58 原创链接http://www.cnblogs...

weixin_30602505的博客 1032

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Python读取音频时长 报错 File contains data in an unknown format.

1.遇到问题 "D:\Program Files\pythonProject1\Scripts\python.exe" C:/Users/Administrator/PycharmProjects/pythonProject1/test_dura.py Traceback (most recent call last): File "D:\Program Files\pythonProject1\lib\site-packages\librosa\core\audio.py", line 713, i.

beautifulYuan的博客 6363

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

audio file format 音频文件的格式

也是无损音频格式,它采用特殊的编码算法,在不损失音质的前提下,对音频数据进行压缩,使文件体积比WAV格式小很多,但音质依然保持与原始音频一致。此外,许多智能手机默认的音频编码格式也是AAC,例如苹果的iPhone设备,其录制的音频文件和系统自带的铃声等大多采用AAC格式。AAC格式的音频文件体积也相对较小,同时具有较高的编码效率和更好的兼容性,被广泛应用于各种现代音频应用中。例如,音乐制作人在录音棚录制乐器演奏或人声演唱时,往往会以WAV格式保存音频素材,以确保音质的高质量,方便后续的精细处理。

NLP与推荐算法 1397

通过lame_enc.dll实现将Wav转为mp3格式.wav要求是16bit

【代码】通过lame_enc.dll实现将Wav转为mp3格式.wav要求是16bit。

GuoGuoABC 1146

alsa数据编码mp3格式

在linux系统中,有的系统没有dsp 设备文件,所以只能使用alsa提供的接口来读取声音设备。alsa 又许多的声卡和声卡驱动组成,它可以直接读取声卡采集到的数据。如同摄像头数据一般,采集到的原始数据都是都是非常大的,不利于我们正常存储和使用,所以出现了很多的压缩方法。本文采用的是国内使用最广的mp3压缩方式。先上代码:/*================================...

Biao 1556

(转载)mp3格式转wav格式 附完整C++算法实现代码

转载:https://www.cnblogs.com/cpuimage/p/8282397.html 近期偶然间看到一个开源项目minimp3 Minimalistic MP3 decoder single header library 项目地址: https://github.com/lieff/minimp3 单文件头的最小mp3解码器。 一直很想抽时间好好看上一看。 最好的学习...

weixin_30569033的博客 506

十分钟让 3A 游戏跑上客厅大屏:Sunshine 自托管游戏串流

周末想在大屏上打一把 3A,游戏却装在书房 PC 里。Sunshine 是一款免费开源的游戏串流主机:装在 PC 上,配合 Moonlight 客户端,把画面、声音和手柄输入原样送到局域网里任何一台设备,不用按月付费。 ## 它到底在解决什么问题:一套自托管串流组合 Sunshine 把你的 PC 变成一座"家庭视频基站":实时抓取屏幕,用显卡的硬件编码器压成视频流,沿网络送出去。手机、平板或

gitblog_00726的博客 333

第三十章 如何在 Silverlight 播放音频或声音文件?

Silverlight 提供了一个名为MediaElement的类用来播放音频或视频文件。 Silverlight中的MediaElement 支持播放MP3 和WMV格式的视频 / 音频文件。现在 Silverlight当前版本不支持播放.WAV 和 .AVI

2768
上一篇: sdk callback mechnism
下一篇: plughw:0,0
Yantai666
博客等级 码龄15年 45粉丝 271原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值