MP3的帧结构

2023-05-16


原文地址:http://www.eefocus.com/jjbearustc/blog/07-09/3716_3e901.html

MP3帧包括以下4个部分:

1、帧头:比特流中包含同步和状态信息的部分。

2、错误校验:比特流中包含查错信息的部分。

3、音频信息:比特流中包含音频采样点信息的部分。

4、辅助数据:比特流中用于辅助数据的部分。

一、帧头结构帧中的头32位是头信息

Sgncword:同步字位串“1111,1111,1111”用掉头信息的前12位。

ID:用来显示算法标识的一位,1表示MPEG音频,0保留。

Layer:用来表示所使用的层的两位,11表示第一层,10表示第二层,01表示第三层,00保留。如果要改变层,则要求解码器重新复位。

Protection_bit:用于表示在音频比特流中是否有冗余来完成查错和隐藏的一位。1为有,0为没有。

Bit_rate_index:比特率索引表示比特速率,全零值表示“任意方式”条件。为了提供最小的可能的延迟和复杂度,在第一、二层中解码器没有必要要求支持连续变化的。第三层通过转换bit_rate_index位支持可变比特率。

Sampling_frequency:用来表示所使用的层的两位,00表示44.1kHz,01表示48kHz,10表示32kHz,11表示保留。

Padding_bit:如果该位为1,那么在MP3的一帧中就可以含有一个额外的数据片来根据平均比特率来调整采样频率;在其他情况下该位置为0,并且该位在采样率44.1kHz下有效。

Private_bit:该位是专用使用位,该位将来由ISO使用。

Mode:在第三层中,加入立体声模式是增强立体声模式或是混合立体声模式。00表示立体声,01加入立体声模式(增强立体声模式或混合立体声模式),10表示双通道,11表示单通道。

Mode extension表示是采用哪一种加入立体声的编码方法。通过下表可以决定如何使用增强立体声和混合立体声这两种模式。

 

增强立体声

混合立体声

00

不采用

不采用

01

采用

不采用

10

不采用

采用

11

采用

采用

                        

Copyright:如果该位等于0那么在编码数据流中就没有版权限制。如果等于1,那么有版权保护。

Riginal/home:如果该位等于0, 那么编码数据流是拷贝而来的,如果为1,那么编码数据流是原始的未经拷贝的。

Emphasis:表示应当使用的不被强调的类型。

二、错误校验部分crc_check

是一个编码比特流中的用于任意错误检测的16位奇偶校验字。

 三、音频数据部分

allocation[sb]:表示在子带sb中用来表示每个采样点的比特的个数。对单声道的子带或采用加入立体声模式的子带有效。

scalefactor[sb]:表示用来与子带sb中的重量化采样点相乘的子带因子。其由六个比特组成一个无符号整数,作为在子带因子表中用来检索的一个索引。

sample[sb][s]:在子带sb中的第s个采样点的编码表示,用于单声道模式和增强立体声模式中的子带采样点数据的表示。

Main_data_end:主数据结束的值,用于决定一帧中主数据的最后一位在比特流中的位置。主结束值以下一帧的帧头为参考的,以字节为标量的负的偏移来指出最后一位在比特流主数据部分中的位置。

Main_data_beg:可以给出一帧中的主数据部分起始端在比特流中的位置。这个位置等于前一帧的主数据结束位置加上一位[g1] ;主数据结束位置可以从前一帧的main_data_end中得到。

Scfsi[scfsi band]:比例因子选择信息。提供了比例因子的数目的信息,这些比例因子要传送给子带sb及在这一帧中这些比例因子在哪一部分有效。第三层使用变化的scfsi_band给每组定标因子而不是每个定标因子提供scfsi的值。scfsi的值控制了在微粒中定标因子的使用:如果scfsi的值为0,定标因子是分别传送给每一个微粒;如果scfsi的值为1,传送给微粒1的定标因子对微粒2来说也是有效的。

scfsi[scfsi_band][ch]:与scfsi[scfsi_band]作用一样,用于双声道模式、立体声模式和增强立体声模式中一个通道的比例因子选择信息。

part2_3_length[gr]:这个值包含了主数据部分中用于表示定标因子和霍夫曼编码数据的比特的数目。因为边带信息的长度总是相同的,所以这个值可以用于计算出每个微粒主信息的起始端和辅助信息的位置。

part2_length:该值包含了在主数据中用于定标因子的比特的数目。其值以下列方式给出:

对于switch_point= 0,

part2_length = 11 * slen1 + 10 * slen2 对于长窗(窗类型为0,1和3),和par2_length= 18 * slen1 + 18 * slen2,对于短窗(窗类型为2)

对于switch_point = 1,

part2_length = 17 * slen1 + 18 * slen2(窗类型为2)。对于长窗,part2_length在窗类型为0,1和3下的值和在switch_point= 0的值是一样的。

big_values[gr]:每一个颗粒的频谱值是用不同的霍夫曼码表编码而成的。从零到奈奎斯特采样频率的整个频段范围可以划分为几个区域:每个区域用不同的霍夫曼码表编码。区域的划分是以最大的量化值作为依据的,这个依据在设想高频的值的幅度比较小或根本就不需要编码这个条件下成立的。从最高频率开始,队成对的量化值为0的值的数目进行记数,所得的数目用rzero表示。然后再将量化值中满足成两对的其绝对值不超过1的个数进行计数,其数目可以用count1表示。那么还有偶数个量化值留下来,最后留下来的值的频带范围会一直下延到零,在这一频段范围内的值就称为big_values。

global_gain[gr]:量化阶大小信息是在边带信息中的global_gain变量传送的,并且该值是对数量化的。

scale_compress[gr]:依据下表选择用于传送定标因子所需比特数目。如果窗类型为0、1或3:slen1:用于表示0到10子带的定标因子的长度;slen2:用于表示11到20子带的定标因子的长度。如果窗类型为2并且switch_point为0:slen1:用于表示0到5子带的定标因子的长度;slen2:用于表示6到11子带的定标因子的长度。如果窗类型为2并且switch_point为1:slen1:用于表示0到7子带的定标因子的长度(长窗定标因子子带)和从4到5的定标因子的长度(窗定标因子子带)。slen2:用于表示6到11子带的定标因子的长度。

blocksplit_flag[gr]:用于表示一个数据块使用不止一个正常窗的标志。如果该标志被置为1,那么其他几个变量会按缺省值设置。region_addressl = 8(在窗类型为1或为3)region_addressl= 9(在窗类型为2)region_addressl = 0,在这种情况下区域2的长度为0。如果该标志没有置为1,那么窗类型为0。

block_type[gr]:表示在第三层一帧中每个颗粒所用的窗的类型。类型0:保留;类型1:起始窗;类型2:3个短窗;类型3:结束窗。

witch_point[gr]:表示长/短转换的分离点。

cb_limit:对应长窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数21。

cb_limit_short:对应短窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数12。

table_select[region][gr]:依据最大量化值和信号本地的数据来采用不同的霍夫曼码表来进行编码,总共有32个霍夫曼码表。

subblock_gain[window][gr]:表示源自全局增益的对应一个子窗的增益偏移,该值仅仅用于窗类型为短窗的情况下,在译码器子窗的值必须除以4的subblock_gain(window)的幂次加以修正。

region_address1[gr]:是一个对频谱的进一步划分来提高霍夫曼编码器的性能,可以说是对由big_values所描述的区域详细划分,以获得一个比较好的错误控制和编码效率。可以划分为3个区域,每个区域根据其最大量化值和本地信号数据使用不同的霍夫曼码表进行编码。region_address[1,2]的值用于指向所划分的区域的边界,区域边界是以将频谱划分成关键子带来排列的。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数,如果switch_point为0,在一个微粒中的定标因子子带的数目为12 × 3=36;如果窗类型为2并且switch_point为1,定标因子子带的数目为8 + 9 × 3 = 35。region_address1统计一直到第一个区域最高频率边缘的定标因子子带的数目。

region_address2[gr]:统计一直到第三个区域最高频率边缘的定标因子子带的局部或全部的数目。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数。preglag[gr]:这是一个对量化值的额外高频的放大的一个简捷途径,如果该值置1,将有一个表中的值加入到定标因子中去。

scalefac_scale[gr]:根据scale_scale使用2或根号2组为量化阶的容量定标因子进行对数量化。scalefac_scale为0量化阶为1.414;scalefac_scale为1量化阶为2。count1table_select[gr]:该标志用来选择在前面提到的count1区域所使用霍夫曼码表。

scalefac[sb][gr]:定标因子用于对量化噪声染色,如果量化噪声用比较合适的形状进行染色,那么量化噪声就阿可以完全被屏蔽掉。在第三层中,定标因子在解码器中用于获得对应每个数据块的划分因子,跨越好几个频率谱线的这些数据块叫做定标因子子带,并且像关键子带一样尽可能紧的加以选择。

haffman_code_bits:对于小于等于15的所有量化值可以用一个霍夫曼码直接编码,一般使用(x,y)来表示。如果量化值的幅度超过15,ESC码就用来标识这些值。如果一对数据不全为0,那么会有一或两位比特附加到霍夫曼码字上。

四、辅助数据Ancillary_bit:辅助位由用户定义。


 [g1]为什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MP3的帧结构 的相关文章

  • SVN

    转自 http blog csdn net gexiaobaohelloworld article details 7752862 SVN简介 SVN xff08 Subversion xff09 是一个自由 开源的项目源代码版本控制工具
  • svn使用的适用技巧

    关于SVN的使用 xff0c 这里整理两个重要的问题 xff1a 1 svn不能commit so 2 34 a 34 等库文件 xff1a svn add 还是 svn st 均查看不到想要提交的 so 文件 后来才知道原来是配置文件出了
  • calico更换ip地址池-k8s

    注意 xff1a 生产环境更换ip地址池会导致网络中断 xff0c 请慎重 在Kubernetes中 xff0c 以下所有三个参数必须等于或包含Calico IP池CIDR xff1a kube apiserver xff1a pod ne
  • Centos 7安装GNOME桌面环境

    第一步 xff1a 列出可安装的桌面环境 span class token punctuation span root 64 local span class token punctuation span span class token
  • Linux anaconda3 安装python版zeroc-ice 3.7.3报 undefined symbol: SSLeay

    原因 xff1a linux通过 pip install zeroc ice 61 61 3 7 3时会从源文件重新编译一个二进制版本 xff0c windows与macos不会重新编译 编译过程依赖openssl 但是centos7版本的
  • npm install提示没有权限

    npm install unsafe perm 61 true allow root
  • mysql排序后分页出现的数据混乱

    原因 xff1a 排序的字段值不唯一 xff0c 值相同时排序顺序不固定 解决方法 xff1a 增加排序字段改用值唯一的字段排序
  • Ubuntu安装mysql,修改数据存储目录

    1 创建目录并修改目录权限 mkdir home abc data chown R mysql mysql home abc data 2 修改mysql配置文件 etc mysql my cnf xff0c 增加以下配置 mysqld d
  • 获取CAS全部配置说明

    直接下载 xff1a CAS Server全部配置详解 通过cas bootadmin获取 通过CAS Initializr获取模块cas bootadmin server overlay curl http localhost 8080
  • SpringBoot配置SSL(https)

    生成证书 keytool genkey alias cas keyalg RSA validity 999 keysize 2048 storetype PKCS12 keypass aaaaaa storepass aaaaaa keys
  • 2018年秋招面经

    Data 2017 10 30 Author cjh 一不小心秋招都结束了 xff0c 趁还有些印象 xff0c 留下点东西造福大众 秋招一般聚集在9月初到10月底 xff0c 大公司快的有些8月中旬就开始了 xff0c 所以大家要把握时间
  • CAS Client部署

    参考内容 官方参考文档 xff1a Java Cas Client Cas Server部署参考 CAS Server部署 xff0c 基于版本6 6 4 修改配置 添加依赖 lt dependency gt lt groupId gt o
  • Python机器学习:train_test_split()划分数据集

    调用sklearn里面的model selection包的train test split 函数可以一行代码划分好数据集 包名 xff1a from sklearn model selection import train test spl
  • 安装Python3.8.10和ssh连接

    xff01 xff01 xff01 xff01 制作镜像之前防火墙要关掉 xff08 必须要关的 xff09 systemctl stop ufw span class token punctuation span service syst
  • WebSSH安装和开机自启设置

    一 安装 apt install nfs span class token punctuation span common WebSSH 要求 Python2 7 或 3 4 43 如果有 Python 环境 xff0c 可以使用 pip
  • novnc安装和开机自启设置

    一 安装和使用novnc 1 下载noNVC span class token function git span clone https github com novnc noVNC git 2 创建安装连接 VNC的默认会话不是安全的
  • vnc安装和开机自启设置

    一 安装VNC 键入以下命令以在 Ubuntu 服务器上安装 TigerVNC xff1a sudo apt install tigervnc standalone server tigervnc common 现在安装了 VNC 服务器
  • 研究生如何发表论文必读

    研究生如何发表论文必读 这是一个一年三篇IF大于7的牛人当我问到他怎么这么强的时候 xff0c 他给我他在网上总结发文章的秘笈 看了实在是心中有一种感觉 xff0c 特奉献出来 一 研究生必备四本 俗话说好记性不如烂笔头 xff0c 所以一
  • Debian Linux进入不了图形界面的折腾

    首先我的操作系统是Debian Linux xff0c 我Debian用的是Xfce桌面环境 xff0c 昨天我用了命令apt get install gnome 安装了一堆软件之后重启 xff0c 就进入不了图形界面了 xff0c 只能进
  • ROS与matlab进行通讯—保姆级教程

    话不多说 xff0c 直接来进行配置 xff1a 所用软件 xff1a windows10下matlab2018b和同一台 电脑上虚拟机 virtubalbox上的Ubuntu melodic 18 04版本 第一步 xff1a 将虚拟机网

随机推荐

  • stm32蜂鸣器实验

    硬件连接 xff1a 提示 xff1a 不能通过IO口直接驱动大功率器件 实验步骤 xff1a 使能IO口时钟 调用RCC APB2PeriphColckCmd 初始化IO口模式 调用函数BEEP Init 操作IO口 xff0c 输出高低
  • samba源码安装

    Data 2017 11 30 Author cjh Theme samba源码安装 最近在玩TI的AM5728开发板 xff0c 采用交叉编译 xff0c 在使用nfs挂在确实有些不习惯 xff0c 所以最后还是忍不住在上面安装了samb
  • vscode使用

    VScode自动调整格式 Shift 43 Alt 43 F 简书 jianshu com vscode 设置 tab 为四个空格 abbcccdde的博客 CSDN博客 vscode设置tab为4个空格 生产力 VSCode必备插件 C
  • Ubuntu使用apt-get安装本地deb包

    Ubuntu使用apt get安装本地deb包 milantgh 博客园
  • 随遇而安也是一种选择

    随遇而安也是一种选择 故事的开头都是相似的 xff0c 故事的结尾各有各的传奇 xff0c 各有各的平凡 题记 高中的岁月总是让人难忘的 xff0c 菁菁岁月中的庆阳一中 xff0c 充满了书生意气的神采飞扬 xff0c 恩师与同窗 xff
  • OFDPA软件概述

    OFDPA软件概述 OF DPA xff08 openflow data plane abstraction xff09 是一个应用软件组件 实现了 openflow与broadcom SDK间适配层的功能 OF DPA在broadcom交
  • freertos和ucos的区别

    一 freeRTOS比uCOS II优胜的地方 xff1a 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c uCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很
  • wget和curl中使用代理

    命令使用代理 wget curl 都支持使用代理 wget e http proxy 61 10 1 4 43 8080 proxy mimvp com curl x 10 1 4 43 8080 proxy mimvp com 环境变量使
  • SQL 触发器与WebApi回执

    1 需求数据库表添加 xff0c 修改 xff0c 删除数据 xff0c 触发器生效 xff0c 推送数据数据到WCF接口 a 创建WCF服务 xff0c 发布服务 b 启用数据库CLR功能 xff0c 默认是关闭状态 EXEC sp co
  • inelliJ IDEA注册码

    http idea lanyus com
  • 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

    今天朋友问我一个问题 xff0c 是这样子的 xff0c 通过正则表达式匹配html标签input包含hidden的字符串 xff0c 具体如下 xff1a 34 lt input type 61 34 hidden 34 id 61 34
  • cmake源码安装

    Data 2017 12 1 Author cjh Theme cmake源码安装 在玩TI AM5728时 xff0c 要用到cmake编译程序 xff0c 无奈开发板又不能用apt get只好自己源码安装了 cmake源码下载 解压源码
  • Ubuntu下逻辑坏道解决方案

    一 逻辑坏道修复方法 逻辑坏道 服务器硬盘相比其他部件是较容易坏的 xff0c 如突然断电 大量频繁写入都会加速硬盘的老化 xff0c 下面介绍一些判断硬盘状况和修复的方法 发现硬盘坏道 dmesg 当有硬盘坏道时 xff0c 通常在dme
  • 解决本地无法ssh连接ubuntu虚拟机

    1 保证双方都能互相ping通 本地 Windows 查看ip xff1a ipconfig ubuntu虚拟机查看ip span class token function ifconfig span 2 保证ubuntu虚拟机安装了ssh
  • 70、在js中为什么0.1+0.2不等于0.3

    并不是所有小数都可以用 完整 的二进制来表示的 xff0c 比如十进制 0 1 在转换成二进制小数的时候 xff0c 是一串无限循环的二进制数 xff0c 计算机是无法表达无限循环的二进制数的 xff0c 毕竟计算机的资源是有限 因此 xf
  • Outlook 2013/2016 显示“正在启动...“ 无法进入Outlook的解决方案

    因上次非正常关闭 xff0c 导致Outlook 2016启动时 xff0c 一直处于启动界面 xff0c 无法进入主界面正常工作 刚开始Outlook 2016启动界面显示的是 34 正在处理 34 查询网上各种方法 xff0c 安全启动
  • H265 CTU、CU、PU、TU划分的特点及要求

    目录 H265 CTU CU PU TU划分的特点及要求大小及划分模式常见问题1 Spec里对于CTU大小的规定在哪 xff1f 2 Spec对于TU大小的规定在哪 xff1f 3 Spec里对于M 2 M 2的划分方式的规定在哪里 xff
  • Oracle VM VirtualBox虚拟机使用问题总结

    我本机的配置是Ubuntu 18 04 43 Oracle VM VirtualBox虚拟机 6 1 12 43 虚拟win7操作系统 xff0c 对虚拟机了解甚少 xff0c 以下仅为一些实践中的经验 xff1a 一 升级后屏幕分辨率问题
  • C语言中string函数详解

    PS xff1a 本文包含了大部分strings函数的说明 xff0c 并附带举例说明 本来想自己整理一下的 xff0c 发现已经有前辈整理过了 xff0c 就转了过来 修改了原文一些源码的问题 xff0c 主要是用char 字义字符串的问
  • MP3的帧结构

    原文地址 xff1a http www eefocus com jjbearustc blog 07 09 3716 3e901 html MP3帧包括以下4个部分 xff1a 1 帧头 xff1a 比特流中包含同步和状态信息的部分 2 错