信号分析基础(一)mp3格式文件解析

MP3格式文件解析:

https://blog.csdn.net/fulinwsuafcie/article/details/8972346

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中文名: 深入解析ATL(第2版) 原名: ATL Internals, 2nd Edition Working with ATL 8 别名: ATL 作者: (美)塔瓦瑞斯译者: 赖仪灵 曹雨田 资源格式: PDF 版本: 扫描版 出版社: 电子工业出版社书号: 9787121049859发行时间: 2007年11月01日 地区: 大陆 语言: 简体中文 简介: 编辑推荐 ATL的发明人Jim Springfield亲自作序推荐。   四位顶尖的Windows编程专家倾力合作,绝对经典再现。   COM、ATL开发人员的必备宝典。   深入分析ATL实现COM内幕细节,展示COM应用中的各类漂亮技巧。   ATL的经典指南现已更新到ATL 8和VisuaI Studio 2005:   四位顶尖的Windows编程专家在本书中系统地揭示了ATL的内部工作原理,他们解释了ATL是 如何工作的,以及为什么要以这样的方式工作。通过本书,客户端开发人员可以掌握ATL中的窗口、COM控件、MFC集成、Web服务代理生成等资源。服务端编程人员可以应用ATL的全COM服务器和对象服务、高吞吐量、高并发Web应用程序和服务的广泛支持。每个Windows开发人员都将从本书中学到强大的方法来增加应用程序的灵活性、减少负载、最大化程序的透明度和可控性。   ·通过图表、示例代码和ATL的内部实现代码来揭密ATL的内部原理。   ·遍历向导以简化在普通应用程序中的ATL开发。   ·掌握C++、COM和ATL中的字符串使用技巧。   ·利用ATL的智能类型:CComPtr、CComQIPtr、CComBSTR和CComVariant。   ·理解并正确实现IUnknown。   ·创建能从COM服务器中暴露COM对象的粘合代码。   ·使用Canned Interface实现来支持对象的永久性、COM集合、枚举器和连接点。   ·使用ATL窗口类和控件建立独立的应用程序和UI组件。   ·使用ATL Servet开发可以运行在微软IIS上的Web应用程序。 虽然.NET系统从1998年才开始其发展进程。但它已经使很多开发人员的编程发生了革命性的变化,并在未来几年将持续得到改进。但是,COM编程(和 ATL)也依然非常有活力,对Microsoft内外的很多开发人员都非常重要。本书的第2版,与第1版一样,提供了您所需要的信息,使我们在这些技术上的投资也将获得最大的回报。                        ——Jim Springfield,ATL发明人 虽然ATL比较精深,但是这本书的讲解非常通俗易懂,语言比较简练,条理非常清楚。即使在读完这本书之后,它仍然可以作为参考书指导我们的开发和学习工作。我想,这就是好书的价值所在吧。            ——潘爱民,经典畅销书《深入解析Windows操作系统,第4版》译者 内容简介 本书主要介绍了ATL技术的原理、内部实现和应用技巧,由当今4 位顶尖的 Windows技术专家联合撰写。全书内容丰富,深入浅出,主要涵盖了ATL内部架构和实现方法、运用向导简化ATL开发、C++/COM/ATL中字符串的使用技巧、理解并正确实现IUnknown、充分利用ATL提供的Smart Types、撰写能够暴露COM服务器上COM对象的粘合代码、利用Canned Interface实现来支持对象持久化/COM群集/枚举、利用ATL Windows类建构独立的应用程序和UI组件等的技术内容。本书适合于广大Windows开发人员阅读参考,是ATL开发人员的必备权威参考书籍。 作者简介 Christopher Tavares,目前在微软工作,是模式与实践方面的专家。有着超过25年的编程经验,涉及的平台从Sinclair ZX-81到多CPU信号处理硬件。 目录: 第2版序 第1版序 前言 致谢 关于作者 联系博文视点 第1章 你好,ATL 1.1 什么是ATL 1.2 创建COM服务器 1.3 插入COM类 1.4 添加属性和方法 1.5 实现附加接口 1.6 脚本支持 1.7 添加永久性 1.8 添加和激发事件 1.9 使用窗口 1.10 COM控件 1.11 容纳控件 1.12 ATL Server Web项目 1.13 总结 第2章 字符串和文本 2.1 字符串数据类型、转换类和辅助函数 2.2 智能BSTR类CComBSTR 2.3 CComBSTR类 2.4 CString类 2.5 总结 第3章 ATL智能类型 3.1 智能VARIANT类CComVariant 3.2 智能SAFEARRAY类CComSafeArray 3.3 智能指针类CComPtr和CComQIPtr 3.4 智能指针类CAutoPtr和CAutoVectorPtr 3.5 ATL内存管理器 3.6 总结 第4章 ATL中的对象 4.1 实现IUnknown 4.2 ATL的层次 4.3 线程模型支持 4.4 IUnknow核心 4.5 我们的类 4.6 CComObject以及其他 4.7 ATL创建者 4.8 调试 4.9 总结 第5章 COM服务器 5.1 回顾COM服务器 5.2 对象映射表和CAtlModule类 5.3 对象映射表 5.4 对象映射类要求的方法 5.5 CAtlModule类 5.6 重游CComCoClass 5.7 ATL与C运行时库 5.8 总结 第6章 接口映射表 6.1 回顾:COM的实体身份 6.2 表驱动的QueryInterface 6.3 多重继承 6.4 Tear-off接口 6.5 聚合:外部控制对象 6.6 接口映射表链 6.7 尽管说“不” 6.8 调试 6.9 扩展性 6.10 总结 第7章 ATL中的永久性 7.1 回顾COM的永久性 7.2 ATL的永久性实现类 7.3 属性映射表 7.4 永久性实现 7.5 其他永久性实现 7.6 使用永久性添加“按值列集”的语义 7.7 总结 第8章 集合和枚举器 8.1 COM集合和枚举接口 8.2 枚举数组 8.3 枚举标准的C++集合 8.4 集合 8.5 ATL数据类型的标准C++集合 8.6 ATL集合 8.7 对象模型 8.8 总结 第9章 连接点 9.1 回顾连接点 9.2 创建基于ATL的可连接对象 9.3 创建一个接收事件的对象 9.4 它是怎么工作的:杂乱的实现细节 9.5 总结 第10章 窗口 10.1 Windows应用程序的结构 10.2 CWindow 10.3 CWindowImpl 10.4 CDialogImpl 10.5 Windows控件包装类 10.6 CContainedWindow 10.7 总结 第11章 ActiveX控件 11.1 回顾ActiveX控件 11.2 BullsEye控件需求 11.3 使用ATL向导创建初始的控件 11.4 初始的BullsEye源文件 11.5 逐步开发BullsEye控件 11.6 总结 第12章 控件包容 12.1 控件是如何被包容的 12.2 基本的控件包容 12.3 在对话框中容纳控件 12.4 复合控件 12.5 HTML控件 12.6 ATL控件包容的限制 12.7 总结 第13章 你好,ATL Server:一个新型的C++ Web平台 13.1 微软Web平台(因特网信息服务) 13.2 可能是可以运行的最简单ISAPI扩展 13.3 封装ISAPI 13.4 ATL Server 13.5 ATL Server中的Web服务 13.6 总结 第14章 ATL Server内幕 14.1 ATL Server中的ISAPI实现 14.2 服务器响应文件 14.3 请求处理程序示例 14.4 输入处理 14.5 会话管理 14.6 数据缓存 14.7 总结 附录A 实例展示C++模板 A.1 模板的必要性 A.2 模板基础 A.3 不同类型的多态 A.4 函数模板 A.5 成员函数模板 A.6 总结 附录B ATL头文件 附录C 移植到ATL 8 C.1 字符串、字符集和转换 C.2 与MFC共享的类 C.3 实现COM服务器 C.4 ActiveX控件和控件容纳 C.5 ATL_MIN_CRT变化 C.6 总结 附录D 属性化ATL D.1 ATL Attributes的基础 D.2 属性化ATL的未来 D.3 总结 索引
计算机网络相关知识、网络结构等等。 序言 前言 第1章 引言 1.1 计算机网络的产生和发展 1.2 计算机网络的功能 1.3 计算机网络分类 1.3.1 局域网 1.3.2 城域网 1.3.3 广域网 1.3.4 互联网 1.3.5 无线网 1.4 网络体系结构 1.4.1 协议分层 1.4.2 服务类型 1.4.3 服务原语 1.5 ISO/OSI参考模型 1.5.1 参考模型 1.5.2 模型评价 1.6 本书的结构 第一部分 数据通信 第2章 数据通信基础知识 2.1 基本概念 2.1.1 信号与通信 2.1.2 模拟通信 2.1.3 数字通信 2.2 数据通信基础理论 2.2.1 信号的频谱和带宽 2.2.2 信道的截止频率与带宽 2.2.3 信道的最大数据传输率 2.3 传输介质 2.3.1 双绞线 2.3.2 同轴电缆 2.3.3 光纤 2.3.4 无线介质 2.4 多路复用 2.4.1 频分多路复用 2.4.2 波分多路复用 2.4.3 时分多路复用 2.5 数据交换技术 2.5.1 电路交换 2.5.2 报文交换 2.5.3 分组交换 2.6 调制解调器 2.6.1 调制方式 2.6.2 Modem标准 2.6.3 Modem分类 2.6.4 工作模式 2.7 小结 习题 第3章 物理层接口 3.1 RS-232-C接口 3.1.1 机械特性 3.1.2 电气特性 3.1.3 功能特性 3.1.4 过程特性 3.1.5 空Modem电缆 3.2 其他接口 3.2.1 RS-449接口 3.2.2 RS-530接口 3.3 小结 习题 第二部分 底层物理网络 第4章 广域网 4.1 广域网结构 4.1.1 虚电路和数据报 4.1.2 两者比较 4.2 广域网实例 4.2.1 PSTN 4.2.2 X.25 4.2.3 DDN 4.2.4 帧中继 4.2.5 SMDS 4.2.6 B-ISDN/ATM 4.3 各种广域网的比较 4.4 小结 习题 第5章 局域网 5.1 介质访问控制协议 5.1.1 ALOHA协议 5.1.2 CSMA协议 5.1.3 CSMA/CD协议 5.2 以太网和IEEE 802.3 5.2.1 物理层标准 5.2.2 MAC协议 5.2.3 性能分析 5.3 令牌环网和IEEE 802.5 5.3.1 MAC协议 5.3.2 管理与维护 5.3.3 性能分析 5.4 网桥 5.4.1 透明网桥 5.4.2 源选径网桥 5.5 小结 习题 第6章 高速局域网 6.1 FDDI网络 6.1.1 与OSI的关系 6.1.2 帧格式 6.1.3 MAC协议 6.1.4 工作原理 6.1.5 拓扑结构 6.1.6 网络容错 6.1.6 技术指标 6.2 快速以太网 6.3 千兆位以太网 6.4 局域网交换机 6.5 小结 习题 第三部分 网络互联 第7章 网络互联与TCP/IP 7.1 网络互联层次 7.1.1 应用级互联 7.1.2 网络级互联 7.2 TCP/IP参考模型 7.3 TCP/IP参考模型的特点 7.3.1 TCP/IP的两大边界 7.3.2 IP层的地位 7.3.3 TCP/IP的可靠性思想 7.3.4 TCP/IP模型的特点 7.4 TCP/IP与ISO/OSI 7.5 小结 习题 第8章 IP 8.1 IP数据报 8.1.1 数据报格式 8.1.2 地址格式 8.2 IPv6 8.2.1 固定头部格式 8.2.2 IPv6地址 8.2.3 扩展头部 8.3 小结 习题 第9章 ARP、RARP和ICMP 9.1 ARP和RARP 9.1.1 ARP 9.1.2 RARP协议 9.1.3 报文格式 9.2 ICMP 9.2.1 ICMP报文类型 9.2.2 ICMP报文格式 9.2.3 ICMP差错报文 9.2.4 ICMP控制报文 9.2.5 ICMP请求/应答报文 9.3 小结 习题 第10章 IP路由协议 10.1 路由器与路由选择 10.1.1 路由器 10.1.2 路由选择 10.2 Internet结构 10.3 基本路由算法 10.3.1 D-V路由算法 10.3.2 L-S路由算法 10.4 IGP:内部网关协议 10.4.1 RIP 10.4.2 IGRP 10.4.3 OSPF协议 10.5 外部网关协议EGP 10.6 Internet组播 10.6.1 组播协议 10.6.2 组的维护 10.6.3 组播范围 10.7 移动IP路由 10.8 无类域间路由 10.9 小结 习题 第11章 传输层协议:TCP和UDP 11.1 传输层基本原理 11.1.1 服务质量 11.1.2 传输层端口 11.2 UDP 11.2.1 UDP报文格式 11.2.2 UDP伪头部 11.2.3 UDP多路复用 11.3 TCP 11.3.1 TCP报文格式 11.3.2 TCP连接端点 11.3.3 TCP可靠传输 11.3.4 TCP流量控制 11.3.5 TCP拥塞控制 11.3.6 TCP连接建立 11.3.7 TCP连接删除 11.3.8 TCP紧急数据传输 11.4 小结 习题 第四部分 网络应用 第12章 客户/服务器模型与套接字编程接口 12.1 网络间进程通信 12.2 客户/服务器模型 12.3 套接字编程接口 12.3.1 套接字基本概念 12.3.2 套接字系统调用 12.3.3 其它系统调用 12.4 基于客户/服务器模型的套接字编程举例 12.4.1 客户/服务器模型流程图 12.4.2 套接字实现机制 12.4.3 Unix环境下的套接字编程举例 12.5 小结 习题 第13章 DNS域名系统 13.1 域名结构 13.1.1 平面型命名机制 13.1.2 层次型命名机制 13.1.3 层次型名字管理 13.1.4 TCP/IP域名 13.2 域名解析 13.2.1 TCP/IP域名服务器 13.2.2 域名解析 13.2.3 逆向域名解析 13.2.4 域名解析的效率 13.3小结 习题 第14章 远程登录Telnet和Rlogin 14.1 为什么要引入远程登录? 14.2 TELNET协议 14.2.1 Telnet工作原理 14.2.2 网络虚终端 14.2.3 Telnet选项 14.3 Rlogin 14.4 小结 习题 第15章 文件传输与访问 15.1 FTP:文件传输协议 15.1.1 FTP特点 15.1.2 FTP工作原理 15.1.3 FTP连接建立 15.1.4 FTP访问控制 15.2 TFTP:简单文件传输协议 15.3 NFS:网络文件系统 15.4 小结 习题 第16章 电子邮件 16.1 电子邮件系统体系结构 16.1.1 ISO/OSI电子邮件系统 16.1.2 TCP/IP电子邮件系统 16.2 TCP/IP电子邮件地址 16.3 TCP/IP电子邮件标准 16.3.1 TCP/IP电子邮件格式 16.3.2 MIME:多用途Internet邮件扩展 16.3.3 SMTP:简单邮件传输协议 16.4 邮箱访问 16.5 小结 习题 第17章 万维网 17.1 Web页面浏览 17.1.1 浏览器和服务器 17.1.2 HTTP 17.1.3 HTML语言 17.2 交互式动态页面 17.2.1 CGI 17.2.2 Java 17.2.3 ASP 17.3小结 习题 第五部分 网络管理与安全 第18章 网络管理 18.1 互连网管理 18.2 SNMP网管体系 18.2.1 管理员/代理模型 18.2.2 MIB:管理信息库 18.2.3 ASN.1 18.2.4 SNMP 18.3 小结 习题 第19章 网络安全 19.1 基本概念 19.2 网络安全攻击 19.3 安全策略 19.4 安全机制 19.4.1 加密 19.4.2 鉴别 19.4.3 数字签名 19.5 防火墙 19.5.1 包过滤 19.5.2 应用级网关 19.6 小结 习题 第20章 网络技术的未来发展 20.1 新型网络应用技术 20.2 宽带网络技术 20.3 无线接入技术 20.4 统一网络技术 20.5 网络安全技术 20.6 主动网络技术 20.7 小结 参考文献
解析MP3音频格式 一、概述 MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3 的全称应为MPEG1 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,而MP3 的压缩率则高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。 名词解释: 比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大。 比特率比特率表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示,而比特就是二进制里面最小的单位,要么是0,要么是1。比特率与音、视频压缩的关系,简单的说就是比特率越高,音、视频的质量就越好,但编码后的文件就越大;如果比特率越少则情况刚好相反。 采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,单位用赫兹(Hz)来表示。采样频率的倒数是采样周期(也称为采样时间),它表示采样之间的时间间隔。这里要注意不要将采样率与位速相混淆。 二、MP3文件整体结构 MP3文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1) ID3V2标签帧 ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。 音频数据帧 一系列的帧,个数由文件大小和帧长决定,每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定,每个FRAME又分为帧头和数据实体两部分,帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立 ID3V1标签帧 ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。 三、MP3结构具体分析 1.ID3V2标签 每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。 标签头 在文件的首部顺序记录10 个字节的ID3V2.3 的头部。数据结构如下: char Header[3]; /*必须为"ID3"否则认为标签不存在*/ char Ver; /*版本号ID3V2.3 就记录3*/ char Revision; /*副版本号此版本记录为0*/ char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/ char Size[4]; /*标签大小,包括标签头的10 个字节和所有的标签帧的大小*/ 注:最后4个字节表示ID3V2标签的大小,在实际寻找首帧的过程中,我发现大部分的mp3文件的标签大小是包含标签头的,但有的又是不包含的,可能是某些mp3编码器写标签的BUG,所以为了兼容只好认为其是包含的,如果按大小找不到,再向后搜索,直到找到首帧为止。 计算ID3V2标签帧的大小: 最后四个字节表示,但每个字节只用7 位,最高位不使用恒为0。所以格式如下: 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 计算大小时要将0 去掉,得到一个28 位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如 下: int ID3V2_Size; ID3V2_Size = (Size[0]&0x7F;)*0x200000 +(Size[1]&0x7F;)*0x4000 +(Size[2]&0x7F;)*0x80 +(Size[3]&0x7F;) (2) 标签帧 每个标签帧都有一个10 个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。 一般我们从标签头中获取信息计算出整个ID3V2标签的大小即可,对于ID3V2的标签帧就不再仔细分析。 2.音频数据 数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。 (1)音频数据帧的帧头 格式如下: AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM 符号 长度(bit) 位置(bit) 描述 A 11 (31~21) 帧同步(所有位置1) B 2 (20~19) MPEG 音频版本ID 00 – MPEG 2.5 01 – 保留 10 – MPEG 2 (ISO/IEC 13818-3) 11 – MPEG 1 (ISO/IEC 11172-3) C 2 (18~17) Layer描述 00 - 保留 01 - Layer III 10 - Layer II 11 - Layer I D 1 (16) 校验位(0 - 紧跟帧头后有16位即2个字节用作CRC校验1 - 没有校验) E 4 (15~12) 比特率(位率)(见比特率索引表) F 2 (11~10) 采样率(见采样率索引表) G 1 (9) 填充位(填充用来达到正确的比特率。) 0 – 没有填充 1 – 填充了一个额外的空位 H 1 (8) 私有bit,可以用来做特殊应用。例如可以用来触发应用程序的特殊事件。 I 2 (7~6) 声道 00 立体声 01 联合立体声(立体声) 10 双声道(立体声) 11 单声道(单声) J 2 (5~4) 扩展模式(仅在联合立体声时有效) 扩展模式用来连接对立体声效果无用的信息,来减少所需的资源。这两个位在联合立体声模式下有编码器动态指定。 K 1 (3) 版权 0无版权 1有版权 L 1 (2) 原创 0 原创拷贝 1 原创 M 2 (1) 强调 00 - 无 01 - 50/15 ms 10 - 保留 11 - CCIT J.17 【帧头信息表】 索引值 MPEG1 MPEG2&MPEG2;.5 Layer1 Layer2 Layer3 Layer1 Layer2&3 0000 Free 0001 32 32 32 32 8 0010 64 48 40 48 16 0011 96 56 48 56 24 0100 128 64 56 64 32 0101 160 80 64 80 40 0110 192 96 80 96 48 0111 224 112 96 112 56 1000 256 128 112 128 64 1001 288 160 128 144 80 1010 320 192 160 160 96 1011 352 224 192 176 112 1100 384 256 224 192 128 1101 416 320 256 224 144 1110 448 384 320 256 160 1111 Bad 【比特率索引表】 Bits MPEG1 MPEG2 MPEG3 00 44100 22050 11025 01 48000 24000 12000 10 32000 16000 8000 11 保留 【采样率索引表】 (2)如何计算音频数据帧长度 我们首先区分两个术语:帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值入下表所示 MPEG1 MPEG2 MPEG2.5 Layer1 384 384 384 Layer2 1152 1152 1152 Layer3 1152 576 576 【每帧采【每帧采样数表】 帧长度是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。 注意:因为有填充和比特率变换,帧长度可能变化。 从头中读取比特率,采样频率和填充, LyaerI使用公式: 帧长度(字节) = 每帧采样数 / 采样频率(HZ) * 比特率(bps)/ 8 +填充 * 4 LyerII和LyaerIII使用公式: 帧长度(字节)= 每帧采样数 / 采样频率(HZ) * 比特率(bps)/ 8 + 填充 例: LayerIII 比特率 128000,采样频率 44100,填充0 =〉帧大小 417字节 (3)计算每帧的持续时间 之前看了一些文章都说mp3的一帧的持续时间是26ms,结果在实际程序的编写中发现无法正确按时间定位到帧,然后又查了一些文章才知道,所谓26ms一帧只是针对MPEG1 Layer III而且采样率为44.1KHz来说是对的,但mp3文件并不都是如此,其实这个时间也是可以通过计算来获得,下面给出计算公式 每帧持续时间(秒) = 每帧采样数 / 采样频率(HZ) 可以这么理解:每帧采用数就是要采取的总数,采样率就是采取的速度,相除 就得到时间。 这样通过计算可知 MPEG1 Layer III 采样率为44.1KHz的一帧持续时间为26.12...不是整数,不过我们权且认为它就是26毫秒吧。 如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的,当然可以按MPEG版本,层数和采样率来建一个表,这样直接查表就可以知道时间了。 3.ID3V1标签 ID3v1标签用来描述MPEG音频文件。包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。以最后128个字节的头三个字节为“TAG”作为有ID3V1的判断依据。 结构如下: AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG 符号 长度(byte) 位置 描述 A 3 (0~2) 标签标志。如果存在标签并且正确的话,必须包含'TAG'。 B 30 (3~32) 标题 C 30 (33~62) 艺术家 D 30 (63~92) 唱片集 E 4 (93~96) 年代 F 30 (97~126) 注释 G 1 (127) 流派 有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。 四、解析方法 当你想读取MPEG文件的信息时,解析前三个字节,判断是否有ID3V2标签,有则根据上面的方法算出ID3V2标签的总大小,这样就找到了音频数据帧的第一帧,读取它的头信息,获取比特率、采样率、MPEG版本号、Layer描述号等信息,根据上面提供的方法算出每帧的长度和每帧持续时间,对于定比特率的其它帧是相同的,也就是说解析第一帧就达到了目的。但这也不是所有情况。变比特率的MPEG文件使用使用所谓比特变换,也就是说每一帧的比特率依照具体内容变化。这时就需要你每一帧都解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值