精华内容
下载资源
问答
  • flac 音频格式标准
    2021-02-05 20:41:45

    文件结构

    总体结构

    一个标准的 flac 音频文件应当包含以下三个结构:

    • 文件头
    • 元数据块区域
    • 音频帧区域

    上述三种结构在 flac 音频文件中顺次排序,一个结构结束后紧接下一个结构。
    flac 中的所有数值,若无特别说明,都是无符号整型数值,占多个字节的数值按高位字节序(大端序)读取。

    文件头

    flac 文件的文件头仅包含一段由4个字节的 ASCII 码组成的标志“fLaC”,用16进制数据表示为:

    66 4C 61 43
    

    元数据块区域

    元数据块区域包含用于描述 flac 音频流的信息以及一些附属的信息,其中的信息以不同类型的块(block)进行记录,称为“元数据块(metadata block)”,一个块结束后紧接着下一个块。
    目前共有7种官方支持的元数据块类型:

    • 流信息:包含关于整个音频流的信息,如采样率、通道数、采样总数等。
    • 填充块:此类块中的数据没有任何意义,通常用于修改元数据时快速填充空余的位置而无需调整整个文件的大小。
    • 应用程序数据:用于记录第三方程序的数据。
    • 定位表:保存快速定位点,用于在音频流中快速定位。
    • 标签信息:用于记录音频作品相关的信息,如:演唱者、专辑、发布日期等。
    • 索引表:记录音频分轨信息。
    • 图片:包含音频相关的图片,通常用于保存音频封面。

    上述类型中,“流信息”类型是 flac 文件中必须拥有的元数据块,而且必须是元数据块区域中的第1个块。除“流信息”类型之外的其他类型元数据块都不是必须的。
    一个元数据块的数据结构如下:

    部分大小说明
    头部是否是最后一个块1字节1位 0:不是最后一个块
    1:是最后一个块
    块的类型7位 0:流信息
    1:填充块
    2:应用程序数据
    3:定位表
    4:标签信息
    5:索引表
    6:图片
    数据的大小3字节(24位)头部后面所跟的数据的大小,不包括头部,单位是字节
    数据头部中“数据的大小”字段规定的大小与“块的类型”一项相符的数据,各类元数据块的数据结构会在之后说明

    除表中列出的元数据块类型外,数值7~126所对应的类型都是保留类型,127这个数值由于会产生和同步码相同的序列所以禁止使用,不应当在 flac 文件中使用这些类型的元数据块。
    由于元数据块头部“数据的大小”字段只有24位,因此最大能容纳的数据大小为16777215字节,约15.9MB。
    对于那些非必须的元数据块,解码器可以根据头部中指示的大小跳过元数据块的数据内容,而不必读取其数据,且不会影响到音频的解码。
    解码器可以根据元数据块头部的“是否是最后一个块”部分来判断当前块是否最后一个元数据块,从而在处理完最后一个元数据块后进入下一个阶段。

    流信息块数据格式

    流信息块记录有音频流的基本信息,这些信息可以供程序在不解码音频流的情况下快速读取,某些情况下解码音频帧时也会需要从流信息块读取信息。
    流信息块的数据大小是固定的,大小为34字节(272位),其结构如下:

    部分大小说明
    最小分块大小16位原始数据分块中最小分块的采样数,有效值:16~65535
    最大分块大小16位 原始数据分块中最大分块的采样数,有效值:16~65535
    若该值和最小分块大小相等,则表示是固定分块大小的数据流
    最小音频帧大小24位数据流中最小音频帧的大小,单位是字节,0表示未知
    最大音频帧大小24位数据流中最大音频帧的大小,单位是字节,0表示未知
    采样率20位 采样率,单位是赫兹(Hz)
    由于音频帧限制,实际最大值为655350,此值不能为0
    通道数3位 声道数量-1
    flac支持1~8个声道
    采样深度5位 采样深度-1位
    flac支持4~32位采样深度,目前的编码器和解码器最高仅支持24位
    总采样数36位数据流中单个通道的总采样数,0表示未知
    MD5签名128位未经编码的音频数据的MD5签名,用于校验音频数据中是否存在错误

    填充块数据格式

    填充块的数据大小必须与其头部中的“数据的大小”信息一致,单位是字节,可以是16777215字节以内的任意大小。填充块中的数据必须是全部为0的二进制序列。

    应用程序数据块数据格式

    部分大小说明
    应用程序ID32位(4字节) 用于区分此块是哪一个应用程序的数据的标识符
    该ID由 flac 开发组织 管理,若想使用某一个 ID 需要申请注册
    可以访问 https://xiph.org/flac/id.html 查看目前有哪些 ID 已被注册使用
    应用程序数据块数据大小-4字节第三方应用程序的数据

    定位表块数据格式

    部分大小说明
    定位点目标帧首个采样的序号64位(8字节) 目标帧中第一个采样的序号
    0xFFFFFFFFFFFFFFFF 表示这是一个占位点
    目标帧偏移量64位(8字节) 目标帧头部相对于第一帧头部的偏移量,单位是字节
    占位点没有这一部分
    目标帧采样数16位(2字节) 目标帧包含的采样的数量
    占位点没有这一部分
    更多定位点同上 定位点的数量没有限制
    定位点不能重复,以采样序号来区分,占位点除外
    定位点必须按采样序号升序排列
    因上述原因,所有占位点必须排在定位表最后

    标签信息块数据格式

    标签信息块是 flac 用于存储音乐信息的标准方式,数据采用 Vorbis Comment 标准。
    此数据块中的长度信息使用低位字节序(小端序)表示。

    部分大小说明
    编码器标识编码器标识长度32位(4字节) 其后编码器标识的长度
    编码器标识是标签信息数据块里的第一个字段,也是必需的字段
    编码器标识编码器标识长度表示编码器标识的字符串,可以随意填写,使用 UTF-8 编码
    自定义标签标签内容长度32位(4字节)其后标签内容的长度
    标签内容标签内容长度 自定义标签的字符串,使用 UTF-8 编码,使用如下键值对格式:
    标签名=标签值

    自定义标签的个数没有限制,标签名可以是随意的
    更多自定义标签同上 标准的标签:
    TITLE:作品名/曲名
    VERSION:版本,标识同一作品/歌曲的不同版本,例如歌曲的混音版本
    ALBUM:专辑,歌曲所属的专辑的名称
    TRACKNUMBER:轨道编号,歌曲在其所属的专辑的编号
    ARTIST:艺术家,作品的创作者,如:歌手、作曲者、朗读者
    PERFORMER:乐曲演奏者,如:指挥、乐团、电子音乐的作曲者
    COPYRIGHT:音频的版权,例:Copyright 2021 BSPR0002
    LICENSE:许可信息,如:“保留所有权利”、许可证的URL
    ORGANIZATION:制作该音频的团体(即录制公司)
    DESCRIPTION:对音频内容的简短描述
    GENRE:流派,对音乐体裁的简短说明
    DATE:音频录制日期
    LOCATION:录制音频的地区
    CONTACT:音频创作者的联系方式
    ISRC:音频的 ISRC 编号(国际标准音像制品编码

    索引表块数据格式

    当一个 flac 文件中包含多个音轨时,可以使用索引表创建快速定位到音轨的点。

    部分大小说明
    媒体目录编号128字节 媒体目录编号,由 ASCII 码可打印字符(0x20~0x7e)组成
    若不足128字节,应用空字符(0x00)在后方补足
    引入轨道采样数64位(8字节) 音频第一个采样到第一个音轨的第一个索引的采样数
    如果音频没有录入引入轨道,或者音频不是从 CD 提取的,则此项应为0
    是否是标准 CD1位 1:表示此表对应一张标准 CD
    0:表示此表不对应标准 CD
    保留区域2071位(258字节+7位)保留区域,此区域所有数位必须为0
    音轨总数8位(1字节) 音频中音轨的数量,最小为1
    标准 CD 音频最大音轨数为100
    音轨音轨偏移量64位(8字节) 音轨第一个索引相对于音频开始处的偏移量,单位是采样
    在标准 CD 音频中,此数必须能被588整除
    音轨编号8位(1字节) 音轨的轨道编号
    索引表中的最后一个轨道是引出轨道,该轨道的轨道编号必须是170或255
    音轨 ISRC96位(12字节) 音轨的 ISRC 编号,由12字节的 ASCII 码数字和字母字符组成
    12字节全为空字符(0x00)表示此轨道没有 ISRC 编号
    轨道类型1位 0:表示这是一个音频轨道
    1:表示这是一个非音频轨道
    预加重标记1位 0:表示不预加重
    1:表示预加重
    保留区域110位(13字节+6位)保留区域,此区域所有数位必须为0
    索引数量8位(1字节) 轨道包含的索引的数量
    除引出轨道外,索引数量最少为1
    引出轨道不能有任何索引,即数量为0

    标准 CD 音频中,单轨索引数量最大为100
    索引索引偏移量64位(8字节) 索引相对于音轨开始处的偏移量,单位是采样
    在标准 CD 音频中,此数必须能被588整除
    索引编号8位(1字节) 索引在音轨中的编号,单个轨道中的索引编号不能重复
    在标准 CD 音频中,轨道第一个索引的编号必须是0或1,此后每个索引的编号必须+1
    编号为0的索引表示该轨道前预留间隙的位置
    保留区域24位(3字节)保留区域,此区域所有数位必须为0
    更多索引同上
    更多音轨同上

    图片块数据格式

    部分大小说明
    图片关系32位(4字节) 描述图片与音频文件的关系
    0:其他
    1:32×32大小文件图标(仅支持PNG)
    2:其他图标
    3:媒体封面
    4:媒体封底
    5:宣传图
    6:媒体图像(如:CD侧封)
    7:艺术家照片
    8:演唱者照片
    9:指挥者照片
    10:乐队、剧团照片
    11:作曲家照片
    12:作词者照片
    13:录音场地照片
    14:录音过程照片
    15:表演过程照片
    16:相关视频截图
    17:万彩图
    18:印象图
    19:艺术家、艺术团队 logo
    20:发行商、工作室 logo
    MIME 类型字符串长度32位(4字节)其后表示图片 MIME 类型的字符串的数据长度,单位是字节
    MIME 类型字符串MIME 类型字符串长度表示图片 MIME 类型的字符串
    描述字符串长度32位(4字节)其后用于描述图片的字符串的数据长度,单位是字节
    描述字符串描述字符串长度描述图片的字符串,使用 UTF-8 编码
    宽度32位(4字节)图片的宽度,单位是像素
    高度32位(4字节)图片的高度,单位是像素
    色位深度32位(4字节)图片的色位深度,单个像素表示颜色使用的总位数
    索引图颜色数量32位(4字节) 使用的图片是索引图时,表示其使用的颜色数量
    0 表示图片不是索引图
    图片数据长度32位(4字节)其后图片数据的长度,单位是字节
    图片数据图片数据长度图片数据

    音频帧区域

    音频帧块区域是 flac 中真正存放音频编码数据的区域,此区域是 flac 中的最后一个区域,文件的末尾即是该区域的结束。
    flac 将原始的音频数据分成一个个块(下文称“分块”),并单独压缩编码为一个个帧。flac 有多种编码方式,编码器通过合理的策略对不同的分块使用合适的编码方式来达到压缩的效果。
    每一个帧都包含如下部分:

    部分说明
    帧头记录帧的相关信息
    子帧帧中每个通道的数据,一个通道对应一个子帧
    对齐填充填充 0,以对齐到一个字节
    帧尾除去帧尾部分所有数据的 CRC-16 校验信息

    帧头

    部分大小说明
    同步码14位固定二进制序列 11111111111110,表示帧的开始
    保留1位固定值 0,用于与 MPEG 音频帧的头15位进行区分
    分块策略1位 表示对原始音频进行分块的方式的数值
    0:固定分块大小
    1:可变分块大小
    此项会对之后的字段产生影响
    此项在所有的帧中必须相同
    分块大小4位 此帧对应音频分块的单个通道内的采样数,此项并非直接表示采样数
    0:保留值
    1:192个采样
    2~5:可用表达式 576×2x-2 算得采样数(576,1152,2304,4608)
    6:从帧头“自定义分块大小”部分取8位二进制数作为采样数
    7:从帧头“自定义分块大小”部分取16位二进制数作为采样数
    8~15:可用表达式 256×2x-8 算得采样数(256,512,1024,2048,4096,8192,16385,32768)
    此项会对之后的字段产生影响
    采样率4位 此帧的采样率,此项并非直接表示采样率
    0:从流信息元数据块获取
    1:88.2kHz
    2:176.4kHz
    3:192kHz
    4:8kHz
    5:16kHz
    6:22.05kHz
    7:24kHz
    8:32kHz
    9:44.1kHz
    10:48kHz
    11:96kHz
    12:从帧头“自定义采样率”部分取8位二进制数,以 kHz 为单位作为采样率
    13:从帧头“自定义采样率”部分取16位二进制数,以 Hz 为单位作为采样率
    14:从帧头“自定义采样率”部分取16位二进制数,乘10后以 Hz 为单位作为采样率
    15:无效值
    此项会对之后的字段产生影响
    通道分配4位 通道的数量以及通道对应哪个声道,以下列表会在每一项后方注明声道的顺序
    0:1通道(单声道)
    1:2通道(左右立体声);左,右
    2:3通道(3声道);左,右,中
    3:4通道(4声道);左前,右前,左后,右后
    4:5通道(5声道);左前,右前,中前,左后,右后
    5:6通道(5.1声道);左前,右前,中前,LFE,左后,右后
    6:7通道(6.1声道);左前,右前,中前,LFE,中后,左后,右后
    7:8通道(7.1声道);左前,右前,中前,LFE,左后,右后,左中,右中
    8:2通道(左侧立体声);左声道,副声道
    9:2通道(右侧立体声);右声道,副声道
    10:2通道(中部立体声);中声道,副声道
    其他:保留
    采样深度3位 每个采样的位数,此项并非直接表示采样深度
    0:从流信息元数据块获取
    1:8位
    2:12位
    3:保留值
    4:16位
    5:20位
    6:24位
    7:保留值
    保留1位固定值 0,无实际用途
    帧编号8~56位(1~7字节) 按 UTF-8 规范编码的数字
    该项的内容与长度取决于分块策略
    当分块策略为0时,该项表示这是第几个帧,最多使用6字节,转换后的数字最多有31个二进制位
    当分块策略为1时,该项表示该帧第一个采样的序号,最多使用7字节,转换后的数字最多有36个二进制位
    自定义分块大小0~16位(0~2字节) 此帧对应音频分块的单个通道内的采样数-1
    该项的长度取决于分块大小字段的数值
    当分块大小字段为不为6或7时,该项长度为0,即没有该字段
    当分块大小字段为6时,该项长度为8位
    当分块大小字段为7时,该项长度为16位
    自定义采样率0~16位(0~2字节) 此帧的采样率
    该项的长度取决于采样率字段的数值
    当采样率字段不在12~14范围内时,该项长度为0,即没有该字段
    当采样率字段为12时,该项长度为8位
    当采样率字段为13或14时,该项长度为16位
    CRC-88位(1字节) 帧头部分除此字段外所有内容的CRC-8校验信息

    子帧

    子帧部分会包含多个子帧,子帧的数量需要通过帧头部分的“通道分配”字段判断,有多少个通道就有多少个子帧,一个子帧紧接下一个子帧。
    每个子帧都包含如下部分:

    部分说明
    子帧头记录子帧的相关信息
    数据 子帧的数据目前有四种类型,对应 flac 中不同的编码方式
    每个子帧会在其中选择一个进行编码
    所有子帧的类型:
    • CONSTANT
    • VERBATIM
    • FIXED
    • LPC
    各种子帧会在之后说明

    子帧头

    部分大小说明
    填充位1位固定值 0,避免出现与同步码相同的序列
    子帧类型6位 表示该子帧属于哪种类型的数值
    0:CONSTANT
    1:VERBATIM
    8~12:FIXED,值需要满足表达式(7+预测器阶数)
    32~63:LPC,值需要满足表达式(31+预测器阶数)
    其他:保留
    无用采样位数(1+x)位 子帧每个采样中有多少位是实际没有用到的

    该字段第1位为 0 时,表示没有无用的采样位,x=0

    该字段第1位为 1 时,表示有无用的采样位,x=无用的采样位数,
    第1位后方要跟一段由(x-1)个 0 和1个 1 组成的二进制序列,
    该序列的长度即是无用的采样位数

    例:
    没有无用采样位;1位;0
    有1位无用采样位;2位;11
    有2位无用采样位;3位;101
    有3位无用采样位;4位;1001
    有4位无用采样位;5位;10001

    根据此项可以推断子帧实际使用的采样位数:采样深度-无用采样位数

    CONSTANT 子帧

    CONSTANT 子帧只包含一个未编码的采样,表示子帧中所有的采样都是相同的。

    部分大小说明
    采样固定值帧采样深度 原始子分块中采样的固定值,其长度为帧的采样深度
    例如帧的采样深度是16位,则此项的长度也是16位

    VERBATIM 子帧

    VERBATIM 子帧即原样子帧,其中的数据没有经过编码。使用这种子帧通常是因为没有找到对原始子分块有效的压缩方式,故而保持原样。

    部分大小说明
    原样数据帧采样深度×帧分块大小原始子分块的原样数据,没有经过编码

    对齐填充

    部分大小说明
    填充0~7位 对子帧末尾不足一个字节的数据进行填充以实现字节对齐
    若前方刚好满一个字节则不需要对齐

    帧尾

    部分大小说明
    CRC-1616位 除去帧尾部分所有数据的 CRC-16 校验信息
    包括帧头、子帧、对齐填充

    本文对音频帧方面的内容尚未编写完成。
    原资料:xiph.org

    更多相关内容
  • 常见音频格式大盘点分析

    千次阅读 2018-03-18 14:29:32
    常见音频格式大盘点分析取样率指的是每一秒钟取样的数目,其单位为赫兹(Hz),通常CD的采样率为44.1 kHz;DAT (Digital Audio Tape) 的采样率为32,44.1 和 48 kHz,其他常见的采样率还有22.05 和 11.025 kHz等。...
    常见音频格式大盘点分析

    取样率


    指的是每一秒钟取样的数目,其单位为赫兹(Hz),通常CD的采样率为44.1 kHz;DAT (Digital Audio Tape) 的采样率为32,44.1 和 48 kHz,其他常见的采样率还有22.05 和 11.025 kHz等。取样频率越高,所能描述的声波频率就越高。


    量化精度


    是指可以将模拟信号分成多少个等级。量化精度越高,音乐的声压振幅越接近原音乐。具体来说就是在数字音频技术里取得采样值后,要对数据进行量化。量化后的数值与原来的采样值是有误差的,这个数值就是量化精度。量化精度越高,量化值与采样值之间的误差就越小,声音听起来就越逼真,越细腻。其单位是Bit,通常CD标准的量化精度是16Bit,DVD标准的量化精度是24Bit。


    更直观的,我们可以把数字音频分为以下几个等级:


    常见音频格式大盘点


    声音不仅有音质属性,同样需要用于传播,太大的体积不利于即时传送,因此就要对声音文件进行压缩,以便日常生活的应用。从下表,我们可以大致了解声音品质与压缩比之间的关系。


    常见音频格式大盘点


    以上两个表格不难看出,整个音质呈升序排列,压缩比越大,同等音频压缩后的体积越小,损失也就越多。下面具体认识下常见音频格式。


    常见的10种音频格式


    1.CDA格式


    常见音频格式大盘点


    要讲音频格式,CD自然是打头阵的先锋。在大多数播放软件的“打开文件类型”中,都可以看到*.cda格式,这就是CD音轨了。其实唱片上的一首首歌曲,并非我们通常理解的一个个文件。要知道,CD唱片格式标准的确定之时,比诸电脑上用的CD-ROM格式还要早一程,所以当初定标准的时候当然不会考虑要让CD-ROM驱动器也能认出CD唱片。


    常见音频格式大盘点


    到后来,为了在电脑上更方便地使用CD音轨,就在电脑上规定:一个CD音轨为一个*.cda文件。所以不论CD音乐的长短,在电脑上看到的“*.cda文件”都是44字节长。cda文件是CD中音轨信息记录文件,cda文件只是个信息文件,不能在自制到硬盘中播放的,也就是说,只能带碟播放,若要复制音轨到硬盘播放,要用到抓音轨软件转成wav、mp3等格式文件。


    2.WAV波形音频格式


    常见音频格式大盘点


    WAV是微软和IBM共同开发的PC标准声音格式,文件后缀名.wav,是一种通用的音频数据文件。通常使用WAV格式用来保存一些没有压缩的音频,也就是经过PCM编码后的音频,因此也称为波形文件,依照声音的波形进行存储,因此要占用较大的存储空间。


    常见音频格式大盘点


    CD唱片包含的就是WAVE格式的波形数据,只是扩展名没写成“.wav”而是“.cda”。另外注意:WAV文件也可以存放压缩音频,但其本身的文件结构使之更加适合于存放原始音频数据并用作进一步的处理。其优点是易于生成和编辑;但缺点也很明显,在保证一定音质的前提下压缩比不够,不适合在网络上播放。


    3.MP3/MP3 Pro格式


    常见音频格式大盘点


    MP3是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III),简称为MP3。它被设计用来大幅度地降低音频数据量。利用MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的文件,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。用MP3形式存储的音乐就叫作MP3音乐,能播放MP3音乐的机器就叫作MP3播放器。最高参数的MP3(320Kbps)的音质较之CD的,FLAC和APE无损压缩格式的差别不多,其优点是压缩后占用空间小,适用于移动设备的存储和使用。


    常见音频格式大盘点

    人耳等响度曲线图


    为了使mp3能在未来仍然保持生命力,mp3PRO格式诞生了。这种格式与之前的mp3相比最大的特点是能在低达64kbps的比特率下仍然能提供近似CD的音质(mp3是128K)。该技术称为SBR(Spectral Band Replication),它在原来mp3技术的基础上专门针对原来mp3技术中损失了的音频细节进行独立编码处理并捆绑在原来的mp3数据上,在播放的时候通过再合成而达到良好的音质效果。mp3PRO格式与mp3是兼容的,所以它的文件类型也是mp3。


    4.WMA格式


    常见音频格式大盘点


    WMA(Windows Media Audio),它是微软公司推出的与MP3格式齐名的一种新的音频格式。由于WMA在压缩比和音质方面都超过了MP3,更是远胜于RA(Real Audio),即使在较低的采样频率下也能产生较好的音质。一般使用Windows Media Audio编码格式的文件以WMA作为扩展名,一些使用Windows Media Audio编码格式编码其所有内容的纯音频ASF文件也使用WMA作为扩展名。WMA 7之后的WMA支持证书加密,未经许可(即未获得许可证书),即使是非法拷贝到本地,也是无法收听的。


    常见音频格式大盘点


    同时,微软公司开始时宣称的:同文件比MP3体积小一倍而音质不变,也得到了兑现。事实上,这个说法,仅仅适用于低比特率的情况,另外,微软公司在WMA 9大幅改进了其引擎,实际上几乎可以在同文件同音质下比MP3体积少1/3左右,因此非常适合用于网络串流媒体及行动装置。


    5.RA格式


    常见音频格式大盘点


    RA采用的是有损压缩技术,由于它的压缩比相当高,因此音质相对较差,但是文件也是最小的,因此在高压缩比条件下表现好,但若在中、低压缩比条件下时,表现却反而不及其他同类型档案格式了。此外RA可以随网络带宽的不同而改变声音质量,以使用户在得到流畅声音的前提下,尽可能高地提高声音质量。由于RA格式的这些特点,因此特别适合在网络传输速度较低的互联网上使用,互联网上许多的网络电台、音乐网站的歌曲试听都在使用这种音频格式。


    6.MIDI格式


    经常玩音乐的人应该常听到MIDI(Musical Instrument Digital Interface)这个词,该技术最初应用在电子乐器上用来记录乐手的弹奏,以便以后重播。不过随着在电脑里面引入了支持MIDI合成的声音卡之后MIDI才正式地成为了一种音频格式。MID文件格式由MIDI继承而来,它并不是一段录制好的声音,而是记录声音的信息,然后在告诉声卡如何再现音乐的一组指令。这样一个MIDI文件每存1分钟的音乐只用大约5~10KB。


    常见音频格式大盘点


    今天MID文件主要用于原始乐器作品,流行歌曲的业余表演,游戏音轨以及电子贺卡等。*.mid文件重放的效果完全依赖声卡的档次。*.mid格式的最大用处是在电脑作曲领域。*.mid文件可以用作曲软件写出,也可以通过声卡的MIDI口把外接音序器演奏的乐曲输入电脑里,制成*.mid文件。普通的MIDI文件许多播放器都支持。


    7.OGG(Ogg Vorbis)格式


    常见音频格式大盘点

    ogg标志鱼


    Ogg全称应该是OGG Vobis(ogg Vorbis)是一种较新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。OGG Vobis有一个很出众的特点,就是支持多声道,随着它的流行,以后用随身听来听DTS编码的多声道作品将不会是梦想。


    常见音频格式大盘点


    Vorbis是这种音频压缩机制的名字,而Ogg则是一个计划的名字,该计划意图设计一个完全开放源码的多媒体系统。 Ogg Vorbis文件的扩展名是.OGG。这种文件的设计格式是非常灵活的,它最大特点是在文件格式已经固定下来后还能对音质进行明显的调节和新算法。在压缩技术上,Ogg Vorbis的最主要特点是使用了VBR(可变比特率)和ABR(平均比特率)方式进行编码。与MP3的CBR(固定比特率)相比可以达到更好的音质。


    8.APE格式


    常见音频格式大盘点

    APE与MP3压缩频谱图


    APE是目前流行的数字音乐文件格式之一。APE是一种无损压缩音频技术,也就是说当你将从音频CD上读取的音频数据文件压缩成APE格式后,你还可以再将APE格式的文件还原,而还原后的音频文件与压缩前的一模一样,没有任何损失。APE的文件大小大概为CD的一半,随着宽带的普及,APE格式受到了许多人的喜爱,特别是对于希望通过网络传输音频CD的朋友来说,APE可以帮助他们节约大量的资源。


    常见音频格式大盘点


    当然,目前只能把音乐CD中的曲目和未压缩的WAV文件转换成APE格式,MP3文件还无法转换为APE格式。事实上APE的压缩率并不高,虽然音质保持得很好,但是压缩后的容量也没小多少。一个34MB的WAV文件,压缩为APE格式后,仍有17MB左右。对于一整张CD来说,压缩省下来的容量还是可观的。


    9.FLAC格式


    常见音频格式大盘点


    FLAC与MP3相仿,都是音频压缩编码,但FLAC是无损压缩,也就是说音频以FLAC编码压缩后不会丢失任何信息,将FLAC文件还原为WAV文件后,与压缩前的WAV文件内容相同。这种压缩与ZIP的方式类似,但FLAC的压缩比率大于ZIP和RAR,因为FLAC是专门针对PCM音频的特点设计的压缩方式。而且可以使用播放器直接播放FLAC压缩的文件,就像通常播放你的MP3文件一样。


    常见音频格式大盘点


    FLAC文件的体积同样约等于普通音频CD的一半,并且可以自由地互相转换,所以它也是音乐光盘存储在电脑上的最好选择之一,它会完整保留音频的原始资料,用户可以随时将其转回光盘,音乐质量不会有任何改变,而在播放当中,FLAC文件的每个数据帧都包含了解码所需的全部信息,中间的错误不会影响其它帧的正常播放,这保证了它的实用有效和最小的网络时间延迟。目前在国内市场上,FLAC已经是和APE齐名的两大最常用无损音频格式之一,并且它的编码技术原理使得它在未来有超过APE的巨大的发展空间。


    10.AAC格式


    常见音频格式大盘点


    AAC实际上是高级音频编码的缩写,苹果ipod、诺基亚手机也支持AAC格式的音频文件。AAC是由Fraunhofer IIS-A、杜比和AT&T共同开发的一种音频格式,它是MPEG-2规范的一部分。AAC所采用的运算法则与MP3的运算法则有所不同,AAC通过结合其他的功能来提高编码效率。AAC的音频算法在压缩能力上远远超过了以前的一些压缩算法(比如MP3等)。它还同时支持多达48个音轨、15个低频音轨、更多种采样率和比特率、多种语言的兼容能力、更高的解码效率。总之,AAC可以在比MP3文件缩小30%的前提下提供更好的音质。


    1幅图总结


    常见音频格式大盘点


    展开全文
  • 详解WAVE音频文件格式

    千次阅读 2019-02-21 15:25:12
    详解WAVE音频文件格式
                   

    详解WAVE音频文件格式

     WAVE声音文件格式是目前Windows最直接保存声音数据的文件格式.在涉及声音信号处理时大多是对WAV文件直接操作,有必要搞清楚所研究声音的文件格式.

    1 RIFF文件与WAV文件

     在Windows环境下,大部分多媒体文件都依循着一种结构来存放信息,称为资源互换文件格式(Resources Interchange File Format),简称RIFF。比如声音的WAV文件,视频的AVI文件,动画的MMM文件等均是由此结构衍生出来的.所以,要掌握多媒体文件格式,首先得认识RIFF的结构.

     RIFF是一种树状结构,其基本组成单位是chunk(即块),每个chunk由辨识码,数据大小和数据组成,如下图。可以看出,一个chunk的长度,就是数据的大小加上8Byte.


    一般而言,chunk本身不允许内部再包含chunk,但有两个例外:以"RIFF"和以"UST"为辨识码的chunk。针对这两种chunk,RIFF又从原先的"裸数据"中切出4Byte作为"格式辨别码",如下图所示.


    对RIFF的树状结构有所了解之后,可以知道它相当于一个根目录,而格式辨识码则相当于具体的盘符如C:,D:等等.Windows下的各种多媒体文件格式就如同在磁盘机下规定只能存放怎样的目录,而在该目录下仅能存放何种数据.

    2 WAV文件头

     顾名思义,WAV就是波形音频文件(Wave Audio),是Windows中用来表示数字化声音的一种标准格式,其文件扩展名为.wav,是一种非常简单的RIFF文件,格式辨识码为"WAVE".整个WAV文件分成两部分:文件头和数据块.WAV格式文件主要有两种文件头.

    2.1标准的44字节文件头

     这种WAV是最简单的一种RIFF格式,包含两个chunk:<fmt—chunk>,<wave—data>,这两个子块都是一个WAV文件必须包含的.
     <fmt—chunk>子块,描述了波形数据<wave~data>的格式,对于44字节文件头,它由结构PCMWAVEF0RMAT组成,其子块大小是sizeof(PCMWAVEF0RMAT),数据是PCMWAVEF0RMAT的数据,如下图所示,其中PCMWAVEF0RMAT是PCM波形音频数据的数据格式结构,大小是l6字节(少数为18字节),定义如下:


     RIFF WAVE Chunk
        =======================
        |名称   |所占字节数 |  具体内容   
        =======================
        | ID      |  4 Bytes    |  'RIFF'    
        ----------------------------------------
        | Size   |  4 Bytes    |             
        ----------------------------------------
        | Type  |  4 Bytes    |  'WAVE'    
        ----------------------------------------

    以'RIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID和Size所占用的字节数,即FileLen - 8 =Size.然后是Type字段,为'WAVE',表示是wav文件.结构定义如下:

     struct RIFF_HEADER { char szRiffID[4];  // 'R','I','F','F' DWORD dwRiffSize; char szRiffFormat[4]; // 'W','A','V','E' };

      Format Chunk
       ====================================================
       | 名称                       |   字节数 |             具体内容               
       ====================================================
        |ID                           |  4Bytes  |   'fmt'                            
       -----------------------------------------------------------------------------------------------
        | Size                      |  4 Bytes  | 数值为16或18,18则最后又附加信息    
       -----------------------------------------------------------------------------------------------
        | FormatTag           |  2 Bytes  | 编码方式,一般为0x0001(WAVE—FORMAT_PCM)             
       -----------------------------------------------------------------------------------------------    
        | Channels              |  2Bytes  | 声道数目,1--单声道;2--双声道       
        ----------------------------------------------------------------------------------------------  
        | SamplesPerSec   |  4 Bytes  | 采样频率                           
       -----------------------------------------------------------------------------------------------   
        | AvgBytesPerSec  |  4 Bytes  | 每秒所需字节数  ===> WAVE_FORMAT
       -------------------------------------------------------------------------------------------------
        | BlockAlign            |  2 Bytes  | 数据块对齐单位(每个采样需要的字节数) 
       -------------------------------------------------------------------------------------------------
        | BitsPerSample     |  2 Bytes  | 每个采样需要的bit数                                 
       -------------------------------------------------------------------------------------------------
       |                               |  2 Bytes  | 附加信息(可选,通过Size来判断有无) 
        ------------------------------------------------------------------------------------------------

    以'fmt '作为标示.一般情况下Size为16,此时最后附加信息没有;如果为18则最后多了2个字节的附加信息.主要由一些软件制成的wav格式中含有该2个字节的
    附加信息.结构定义如下:

     struct WAVE_FORMAT { WORD wFormatTag; WORD wChannels; DWORD dwSamplesPerSec; DWORD dwAvgBytesPerSec; WORD wBlockAlign; WORD wBitsPerSample; }; struct FMT_BLOCK { char  szFmtID[4]; // 'f','m','t',' ' DWORD  dwFmtSize; WAVE_FORMAT wavFormat; };

    为了产生出能够正确读出的WAV文件,必须严格注意以下几个分量间的特定关系,否则产生出的文件将无法正常播放:
    nAvgBytesPerSec = nSamplesPerSec*nChannels*wBitsPerSample/8
    nBlockAlign = nChannels*wBitsPerSample/8
    根据以上规则,下图给出一个8kHz采样,16bit量化的声音文件的<fmt—chunk>.

    2.2 58字节文件头

    如果不是Windows的标准WAV文件,而是经过了一些软件处理的,往往就是58字节的文件头,如下图所示.


    它比44字节的多了一个fact子块.<fact—ck>储存了关于WAV文件内容的重要信息.该子块定义如下:

    Fact Chunk
        ======================
        |名称  |所占字节数|  具体内容   
        ======================
        | ID     |  4 Bytes   |  'fact'    
        ---------------------------------------
        | Size  |  4 Bytes  |  数值为4   
        -------------------------------------
        | data  |  4 Bytes |            
        -------------------------------------

    Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk.结构定义如下:

     struct FACT_BLOCK { char  szFactID[4]; // 'f','a','c','t' DWORD  dwFactSize; };

    3 "data"子块数据安排方式

     "data"子块中装的是真正的声音数据.除非安装其它特殊软件,否则Windows目前仅提供WAVE_FORMAT_PCM一种数据格式,即脉冲编码调制(Pulse Code Modulation).针对此惭式,Windows中"data"子块中数据存放的形式如下图所示,根据声道数不同及取样位数的不同,安排4位的位置.


        Data Chunk头结构定义如下:

    struct DATA_BLOCK { char szDataID[4]; // 'd','a','t','a' DWORD dwDataSize; };

     注意:Windows中将16位值的范围定为[-32768,32767].另外,0并不一定代表无声,而是由中间数值来决定,即8位的时候为128,l6位时0才是无声.所以,编程中需要放入无声的数据时,必须先认清声音格式是l6位还是8位.
     通常解压缩后得到的文件仅仅是裸数据,不能正常播放声音.了解了WAV文件格式后,就可以按照标准的44字节格式,在解码数据前编写一个正确的WAV文件头,使其成为一个有效的WAV文件.

    4 实例文件分析

      下面我们来分析一个真正的WAVE文件(http://download.csdn.net/detail/ce123/5771797).


    对照前面的讲解,看懂这个文件的结构应该非常容易大笑.

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • Matlab音频格式转换

    千次阅读 2020-05-07 10:46:28
    所需前置知识 读音频 audioread 语法:   [y,Fs] = audioread(filename);   从名为 filename 的文件中读取数据,并返回样本...   读取文件中所选范围的音频样本,其中 samples 是 [start,finish] 格式的向量。 ...

    所需前置知识
    读音频 audioread
    语法:
      [y,Fs] = audioread(filename);   从名为 filename 的文件中读取数据,并返回样本数据 y 以及该数据的采样率 Fs。
      
      [y,Fs] = audioread(filename,samples);   读取文件中所选范围的音频样本,其中 samples 是 [start,finish] 格式的向量。
      
      [y,Fs] = audioread(___,dataType) ;   返回数据范围内与 dataType(‘native’ 或 ‘double’)对应的采样数据,可以包含先前语法中的任何输入参数。
    写音频audiowrite
    语法:
      audiowrite(filename,y,Fs);  以采样率 Fs 将音频数据矩阵 y 写入名为 filename 的文件。filename 输入还指定了输出文件格式。输出数据类型取决于音频数据 y 的输出文件格式和数据类型。
      
      audiowrite(filename,y,Fs,Name,Value) ;  使用一个或多个 Name,Value 对组参数指定的其他选项。
    FFT 离散傅立叶变换的快速算法:此处 FFT 只用作绘制频谱图像进行分析,并不对音频格式转换有直接的影响:
      N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方,但是这里直接取读取出来的样本数作为N。

    FFT 计算公式如下:
    

    在这里插入图片描述

    Xk 长度与 N 相同。
    根据奈科斯特定律,只有 f=fs/2 范围内的信号才是被采样到的有效信号,因此得到的频谱肯定是关于 N/2 对称的(就是只看前一半的波形就好)。
    第k点的实际频率的计算为 f(k) = k * (fs / n) — — (横轴的频率范围为 :f = n * fs / N;)
    X[0] 为直流分量 ,幅值 = 模值(X[0]) / N
    X[k] 为个点的频率分量(除X[0]外),幅值 = 模值(X[k]) / (N / 2)
    

    1 参数定义

    能够修改的参数,放在这个部分来定义。
    
    代码片段:
    
    	%%  参数定义  %%%%%%%%%%%
        % 音频文件参数
        % source_FS = 16000; %原采样率(该值弃用,从文件读取)
        dest_FS = 8000; %目标采样率
        bps = 16;       %位深 (查看帮助文档可以获取支持的 bps)
        Tfile = 0;      %声音片段的总时长s (0为不修改)
    
        % 音频通道
        stereo = 'mono';            % 输出音频通道 'mono':单声道,'stereo':立体声
        audio_ch = 'left';          % 立体声输入,单声道输出时,选用哪一通道? 'left''right''both'
        Left_channel_ratio = 0.5;   % 左声道占比
    
        % 文件
        inputfile = ('connected_CN.mp3');   % 输入文件名
        outputfile = [inputfile,'.wav'];    % 输出文件名
        AudioInfo = audioinfo(inputfile)    % 打印输入音频文件的信息(不加分号)
    
        %播放设置
        isplay = 1; % 0:播放原音频 1:播放生成音频
    

    2 原始音频文件读取

    读入原始音频,记得修改对应的文件名,带后缀。如果选择播放原音频,那么读取完源文件后,会从电脑喇叭播放声音。
    
    代码片段:
    
     %%  原始音频文件读取  %%%%%%%%%%%
        [y_input,source_FS]=audioread(inputfile);         % 将 WAV 文件转换成变量
        fs_str = ['(Fs:',num2str(source_FS/1000),'KHz)']; % fs 的字符串,在图上显示文件 fs
        whos y_input                                      % 打印y的信息
        if isplay == 0                                    % 如果选择播放原音频
            if source_FS < 192000                         %     电脑小于 192K 采样率才能播放
                sound(y_input,source_FS)                  %     调用可以播放声音的函数 sound()
            end
        end
    

    3 打印输入波形图像

    这一步将 audioread 读取出来的原音频数据,通过图像展示出来,原音频文件解码后,会得到一个列表,根据源文件的通道数n来区分,常用的通道是双通道,即2声道立体声,还有有其他的如:2.1声道、4声道、5.1声道、7.1声道等,对应的n会不同,此处我只对2声道的立体声做处理,有需要其他声道的,可以在此基础上,增加不同 n 值处理的方法。
    
    代码片段
    
     %%  打印输入波形图像  %%%%%%%%%%%
        figure('Name','输入文件波形','NumberTitle','off');
        [m,n] = size(y_input);                  % 计算文件的长度与声道数量
        if n==1                                 % 单声道
            y1 = y_input(:,1);                  % 提取声道数据
            subplot(2,1,1);             
            plot(y1);                           % 描绘左声道图像
            title(['单声道原始波形 ',fs_str]);
            legend(fs_str);                     % 显示图例
            
            subplot(2,1,2);
            Y_fft = fft(y1,4096);               % 计算 FFT
            plot(abs(Y_fft));                   % 描绘 FFT 图像
            title('单声道原始波形频谱')
    
        else                                    % 立体声                          
            y1 = y_input(:,1);                  % 提取左声道数据
            y2 = y_input(:,2);                  % 提取右声道数据
            
            subplot(2,2,1);                     
            plot(y1);                           % 描绘左声道图像
            title(['左声道原始波形 ',fs_str]);
            legend(fs_str);                     % 显示图例
            
            subplot(2,2,2);
            plot(y2);                           % 描绘右声道图像
            title(['右声道原始波形 ',fs_str]);
            legend(fs_str);                     % 显示图例
            
            subplot(2,2,3); 
            Y_fft1 = fft(y1,4096);              % 左声道 FFT 计算
            plot(abs(Y_fft1));                  % 描绘左声道 FFT 图像
            title('左声道原始波形频谱')
            
            subplot(2,2,4);   
            Y_fft2 = fft(y2,4096);              % 右声道 FFT 计算               
            plot(abs(Y_fft2));                  % 描绘右声道 FFT 图像
            title('右声道原始波形频谱')
        end    
    

    4 输出参数设置

    这一个步骤是根据 2.1 设置的参数来去对读取出来的声道列表进行计算,可以根据需求来这里增加对音频序列的操作,但是本文的目标是转码,不做音频处理,因此,此处不对音频数据进行过多的处理。
    

    代码片段:

    %% 输出参数设置  %%%%%%%%%%%
    if strcmp(stereo,'mono')                % 输出选项为单声道
        if n == 1                           % 如果输入文件是单声道文件
            y_ratio = y1;                   % 那么输出文件的数据与输入文件的数据一致
        else                                % 如果输入是立体声文件
            if strcmp(audio_ch,'left')      %     输出通道选择 左声道
                y_ratio = y1;               %     将左声道的数据作为输出数据
            elseif strcmp(audio_ch,'right') %     输出通道选择 右声道
                y_ratio = y2;               %     将右声道的数据作为输出数据
            else                            %     输出通道选择其他选项(both)
                y_ratio = y1*Left_channel_ratio + y2*(1-Left_channel_ratio); % 就将左声道数据与右声道数据,按照设定的比例来混合。
            end
        end
    else                                    % 如果输出选项为立体声
        if n == 1                           % 输入文件是单声道
            y_ratio(:,1) = y1;              % 那么左右声道都用输入的数据
            y_ratio(:,2) = y1;
        else                                % 输入文件是立体声
            y_ratio = y_input;              % 那么输出文件的数据与输入文件的数据一致
        end
    end
    

    5 生成输出音频并转码

    这一步是本文的关键步骤,转码的核心就是调用 audiowrite() ,也是需要去学习使用的函数。
    代码片段:
    
     %% 生成输出音频并转码  %%%%%%%%%%%
        y_out = resample(y_ratio,dest_FS,source_FS);              % 对即将输出的数据,进行重采样到设定的采样率
        audiowrite(outputfile,y_out,dest_FS,'BitsPerSample',bps); % 将输出数据存储为音频文件。
    

    6 输出音频文件读取

    这一步将刚才生成的音频文件再重新读入进来,用于检查格式转换后的效果。如果选择播放生成音频,那么读取完源文件后,会从电脑喇叭播放声音。
    
    代码片段:
    
     %% 输出音频文件读取  %%%%%%%%%%%
        figure('Name','输出文件波形','NumberTitle','off');    % 打开第2个figure
        [y_output,dest_FS]=audioread(outputfile);            % 将上一步生成的文件读取出来保存为变量
        fs_str = ['(Fs:',num2str(dest_FS/1000),'KHz)'];      % 采样率字符串
    
        if isplay == 1                                       % 如果选择播放生成音频
            if dest_FS < 192000                              %     电脑小于 192K 采样率才能播放
                sound(y_output,dest_FS)                      %     调用可以播放声音的函数 sound()
            end
        end
    

    7 打印输出波形图像

    这一步将 audioread 读取出来的转码后的音频数据,通过图像展示出来,操作方式与原文件的读取并打印波形类似。
    
    代码片段:
    
     %%  打印输出波形图像 (跟打印输入波形图像类似,由于后续复用性较低,就不单独编写函数了)  %%%%%%%%%%%
        [m,n] = size(y_output);                    % 计算文件的长度与声道数量 
        if n==1                                    % 单声道
            y1 = y_output(:,1);                    % 提取声道数据
            subplot(2,1,1);
            plot(y1);                              % 描绘左声道图像
            title(['单声道生成波形 ',fs_str]);
            legend(fs_str);                        % 显示图例
            
            subplot(2,1,2);
            Y_fft = fft(y1,4096);                   % 计算 FFT
            plot(abs(Y_fft));                       % 描绘 FFT 图像
            title('单声道生成波形频谱');
    
        else                                        %立体声
            y1 = y_output(:,1);                     % 提取左声道数据
            y2 = y_output(:,2);                     % 提取右声道数据
            
            subplot(2,2,1);
            plot(y1);                               % 描绘左声道图像
            title(['左声道生成波形 ',fs_str]);
            legend(fs_str);                         % 显示图例
            
            subplot(2,2,2);
            plot(y2);                               % 描绘右声道图像
            title(['右声道生成波形 ',fs_str]);
            legend(fs_str);                         % 显示图例
            
            subplot(2,2,3);
            Y_fft1 = fft(y1,4096);                  % 左声道 FFT 计算
            plot(abs(Y_fft1));                      % 描绘左声道 FFT 图像
            title('左声道生成波形频谱')
            
            subplot(2,2,4);                         
            Y_fft2 = fft(y2,4096);                  % 右声道 FFT 计算
            plot(abs(Y_fft2));                      % 描绘右声道 FFT 图像
            title('右声道生成波形频谱')
        end    
    

    3、运行图片

    先准备两首歌,用于测试。分别将 .m4a 转成 .ogg,将 .flac 转成 .wav。
    3.1 例:.m4a 转 ogg
    在这里插入图片描述

    “萨克斯 - 莫斯科郊外的晚上 - 纯音乐.m4a” 转 .ogg,且将44.1KHz 采样率转为 48KHz采样率。
      由于上述代码中,是按照 wav 的格式来输出,audiowrite 中的 name-value 键值对对 ogg 无效,因此修改一下 audiowrite 函数的 name-value 键值对,按照帮助文档提供的设置,可以选择以下选项:
    在这里插入图片描述

    因此修改一下 audiowrite 为:

    audiowrite(outputfile,y_out,dest_FS,'Quality',100); % 将输出数据存储为音频文件。
    

    同时修改 inputfile 与 outputfile。
    运行程序后,生成下面文件
    在这里插入图片描述

    3.2 例:.flac转 wav

    按照老方法,修改一下 audiowrite 函数的 name-value 键值对,选用bps参数。
    在这里插入图片描述

    运行代码,
    同样也生成了“张国荣-沉默是金.flac.wav”文件,显示区间显示,有需要可以通过这个地方来设置在这里插入图片描述
    在这里插入图片描述

    完整代码

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %   功能:音频格式转换(任意格式互转)           % 
    %   作者:Mr-Ma Technology(马健维)             %
    %   时间:2020.04.09                           %
    %   转载请注明出处                             %
    %   https://blog.csdn.net/qq_29225913/article/details/105445028
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %% 支持的转换格式  %%%%%%%%%%%
    % |-----------------------------------------------------|
    % |            格式                     |  输入 |  输出  | 
    % |-----------------------------------------------------|
    % |WAVE (.wav)                          |  支持 |  支持  |
    % |OGG (.ogg)                           |  支持 |  支持  |
    % |FLAC (.flac)                         |  支持 |  支持  |
    % |AU (.au)                             |  支持 | 不支持 |
    % |AIFF(.aiff/.aif)                     |  支持 | 不支持 |
    % |AIFC (.aifc)                         |  支持 | 不支持 |
    % |MP3 (.mp3) (注意电脑版本)             |  支持 | 不支持 |
    % |MPEG-4 AAC(.m4a/.mp4)(注意电脑版本)   |  支持 |  支持  |
    % |-----------------------------------------------------|
    
    % 更多详细信息,请参考 Matlab 相关描述(通道数、比特率、位深)
    % audioread :https://ww2.mathworks.cn/help/matlab/ref/audioread.html
    % audiowrite :https://ww2.mathworks.cn/help/matlab/ref/audiowrite.html?ue&s_tid=gn_loc_dropp
    
    %% 清空内存里的变量  %%%%%%%%%%%
    clear; 
    close all; 
    clc;
    %%  参数定义  %%%%%%%%%%%
    % 音频文件参数
    % source_FS = 16000; %原采样率(该值弃用,从文件读取)
    dest_FS = 48000; % 目标采样率
    bps = 16;        % 位深 -audiowrite 参数(适用于输出 .wav/.flac 文件)
    qlt = 80;       % Quality -audiowrite 参数(适用于输出 .ogg 文件)
    br  = 0;         % BitRate -audiowrite 参数(适用于输出 .m4a/.mp4 文件) 
    % Tfile = 0;       % 声音片段的总时长s (0为不修改) 暂时没用这个参数
    
    % 音频通道
    stereo = 'stereo';            % 输出音频通道 'mono':单声道,'stereo':立体声
    audio_ch = 'left';          % 立体声输入,单声道输出时,选用哪一通道? 'left''right''both'
    Left_channel_ratio = 0.5;   % 左声道占比
    
    % 文件
    inputfile = ('张国荣-沉默是金.flac');   % 输入文件名
    outputfile = [inputfile,'.wav'];    % 输出文件名
    AudioInfo = audioinfo(inputfile)    % 打印输入音频文件的信息(不加分号)
    
    %播放设置
    isplay = 1; % 0:播放原音频 1:播放生成音频
    
    % 绘图
    isdraw = 1;                  % 1:打开绘图, 0:关闭绘图, 计算 FFT 需要消耗时间
    t_axis = [-1 1];             % 时域图显示区域(纵坐标),按实际来改
    f_axis = [0 20000 0 0.002];  % 频域图显示区域,按实际来改
    
    %%  原始音频文件读取  %%%%%%%%%%%
    [y_input,source_FS]=audioread(inputfile);         % 将 WAV 文件转换成变量
    fs_str = ['(Fs:',num2str(source_FS/1000),'KHz)']; % fs 的字符串,在图上显示文件 fs
    whos y_input                                      % 打印y的信息
    if isplay == 0                                    % 如果选择播放原音频
        if source_FS < 192000                         %     电脑小于 192K 采样率才能播放
            sound(y_input,source_FS)                  %     调用可以播放声音的函数 sound()
        end
    end
    
        
    %%  打印输入波形图像  %%%%%%%%%%%
    if isdraw == 1
        figure('Name','输入文件波形','NumberTitle','off');
        [N,n] = size(y_input);                  % 计算文件的长度与声道数量
        if n==1                                 % 单声道
            y1 = y_input(:,1);                  % 提取声道数据
            subplot(2,1,1);             
            plot(y1);                           % 描绘左声道图像
            axis([0 N t_axis]);                 % 根据实际情况,限制可显示区间
            xlabel('采样点');ylabel('幅度');
            title(['单声道原始波形 ',fs_str]);
    
            subplot(2,1,2);
            NFFT = source_FS * floor(N / source_FS);   % FFT 点数取 fs 的倍数
            Y_fft = abs(fft(y1,NFFT));                 % 左声道 FFT 计算
            A_FFT1 = Y_fft * 2 / NFFT;                 % 转换为幅值
            A_FFT1(1) = 0;                             % 忽略直流分量的影响
            f = (0:(NFFT/2)) * source_FS / NFFT;       % 频率范围,横坐标(半边谱)
            plot(f ,A_FFT1(1:NFFT/2 +1));              % 描绘 FFT 图像
            axis(f_axis);                              % 根据实际情况,限制可显示区间
            xlabel('频率/Hz');ylabel('振幅');
            title('单声道原始波形频谱')
    
        else                                    % 立体声                          
            y1 = y_input(:,1);                  % 提取左声道数据
            y2 = y_input(:,2);                  % 提取右声道数据
    
            subplot(2,2,1);                     
            plot(y1);                            % 描绘左声道图像
            axis([0 N t_axis]);                  % 根据实际情况,限制可显示区间
            xlabel('采样点');ylabel('幅度');
            title(['左声道原始波形 ',fs_str]);
    
            subplot(2,2,2);
            plot(y2);                            % 描绘右声道图像
            axis([0 N t_axis]);                  % 根据实际情况,限制可显示区间
            xlabel('采样点');ylabel('幅度');
            title(['右声道原始波形 ',fs_str]);
    
            subplot(2,2,3); 
            NFFT = source_FS * floor(N / source_FS);    % FFT 点数取 fs 的倍数
            Y_fft1 = abs(fft(y1,NFFT));                 % 左声道 FFT 计算
            A_FFT1 = Y_fft1 * 2 / NFFT;                 % 转换为幅值
            A_FFT1(1) = 0;                              % 忽略直流分量的影响
            f = (0:(NFFT/2)) * source_FS / NFFT;        % 频率范围,横坐标(半边谱)
    
            plot(f ,A_FFT1(1:NFFT/2 +1));               % 描绘 FFT 图像
            axis(f_axis);                               % 根据实际情况,限制可显示区间
            xlabel('频率/Hz');ylabel('振幅');
            title('左声道原始波形频谱')
    
            subplot(2,2,4);   
            NFFT = source_FS * floor(N / source_FS);    % FFT 点数取 fs 的倍数
            Y_fft2 = abs(fft(y2,NFFT));                 % 左声道 FFT 计算
            A_FFT2 = Y_fft2 * 2 / NFFT;                 % 转换为幅值
            A_FFT2(1) = 0;                              % 忽略直流分量的影响
            f = (0:(NFFT/2)) * source_FS / NFFT;        % 频率范围,横坐标(半边谱)
    
            plot(f ,A_FFT2(1:NFFT/2 +1));               % 描绘 FFT 图像
            axis(f_axis);                               % 根据实际情况,限制可显示区间
            xlabel('频率/Hz');ylabel('振幅');
            title('右声道原始波形频谱')
        end    
    end
    %% 输出参数设置  %%%%%%%%%%%
    if strcmp(stereo,'mono')                % 输出选项为单声道
        if n == 1                           % 如果输入文件是单声道文件
            y_ratio = y1;                   % 那么输出文件的数据与输入文件的数据一致
        else                                % 如果输入是立体声文件
            if strcmp(audio_ch,'left')      %     输出通道选择 左声道
                y_ratio = y1;               %     将左声道的数据作为输出数据
            elseif strcmp(audio_ch,'right') %     输出通道选择 右声道
                y_ratio = y2;               %     将右声道的数据作为输出数据
            else                            %     输出通道选择其他选项(both)
                y_ratio = y1*Left_channel_ratio + y2*(1-Left_channel_ratio); % 就将左声道数据与右声道数据,按照设定的比例来混合。
            end
        end
    else                                    % 如果输出选项为立体声
        if n == 1                           % 输入文件是单声道
            y_ratio(:,1) = y1;              % 那么左右声道都用输入的数据
            y_ratio(:,2) = y1;
        else                                % 输入文件是立体声
            y_ratio = y_input;              % 那么输出文件的数据与输入文件的数据一致
        end
    end
    
    %% 生成输出音频并转码  %%%%%%%%%%%
    y_out = resample(y_ratio,dest_FS,source_FS);              % 对即将输出的数据,进行重采样到设定的采样率
    audiowrite(outputfile,y_out,dest_FS,'BitsPerSample',bps); % 将输出数据存储为音频文件。
    %audiowrite(outputfile,y_out,dest_FS,'Quality',qlt); % 将输出数据存储为音频文件。
    
    %% 输出音频文件读取  %%%%%%%%%%%
    [y_output,dest_FS]=audioread(outputfile);            % 将上一步生成的文件读取出来保存为变量
    fs_str = ['(Fs:',num2str(dest_FS/1000),'KHz)'];      % 采样率字符串
    
    if isplay == 1                                       % 如果选择播放生成音频
        if dest_FS < 192000                              %     电脑小于 192K 采样率才能播放
            sound(y_output,dest_FS)                      %     调用可以播放声音的函数 sound()
        end
    end
    
    %%  打印输出波形图像 (跟打印输入波形图像类似,由于后续复用性较低,就不单独编写函数了)  %%%%%%%%%%%
    if isdraw == 1
        figure('Name','输出文件波形','NumberTitle','off');    % 打开第2个figure
        [N,n] = size(y_output);                    % 计算文件的长度与声道数量 
        if n==1                                    % 单声道
            y1 = y_output(:,1);                    % 提取声道数据
    
            subplot(2,1,1);
            plot(y1);                              % 描绘左声道图像
            axis([0 N t_axis]);                    % 根据实际情况,限制可显示区间
            xlabel('采样点');ylabel('幅度');
            title(['单声道生成波形 ',fs_str]);
    
            subplot(2,1,2);
            NFFT = dest_FS * floor(N / dest_FS);    % FFT 点数取 fs 的倍数
            Y_fft = abs(fft(y1,NFFT));              % 左声道 FFT 计算
            A_FFT1 = Y_fft * 2 / NFFT;              % 转换为幅值
            A_FFT1(1) = 0;                          % 忽略直流分量的影响
            f = (0:(NFFT/2)) * dest_FS / NFFT;      % 频率范围,横坐标(半边谱)
            plot(f ,A_FFT1(1:NFFT/2 +1));           % 描绘 FFT 图像
            axis(f_axis);                           % 根据实际情况,限制可显示区间
            xlabel('频率/Hz');ylabel('振幅');
            title('单声道生成波形频谱');
    
        else                                        % 立体声
            y1 = y_output(:,1);                     % 提取左声道数据
            y2 = y_output(:,2);                     % 提取右声道数据
    
            subplot(2,2,1);
            plot(y1);                               % 描绘左声道图像
            axis([0 N t_axis]);                     % 根据实际情况,限制可显示区间
            xlabel('采样点');ylabel('幅度');
            title(['左声道生成波形 ',fs_str]);
    
            subplot(2,2,2);
            plot(y2);                               % 描绘右声道图像
            axis([0 N t_axis]);                     % 根据实际情况,限制可显示区间
            xlabel('采样点');ylabel('幅度');
            title(['右声道生成波形 ',fs_str]);
    
            subplot(2,2,3);
            NFFT = dest_FS * floor(N / dest_FS);    % FFT 点数取 fs 的倍数
            Y_fft1 = abs(fft(y1,NFFT));             % 左声道 FFT 计算
            A_FFT1 = Y_fft1 * 2 / NFFT;             % 转换为幅值
            A_FFT1(1) = 0;                          % 忽略直流分量的影响
            f = (0:(NFFT/2)) * dest_FS / NFFT;      % 频率范围,横坐标(半边谱)
    
            plot(f ,A_FFT1(1:NFFT/2 +1));           % 描绘 FFT 图像
            axis(f_axis);                           % 根据实际情况,限制可显示区间
            xlabel('频率/Hz');ylabel('振幅');
            title('左声道生成波形频谱')
    
            subplot(2,2,4);                         
            NFFT = dest_FS * floor(N / dest_FS);    % FFT 点数取 fs 的倍数
            Y_fft2 = abs(fft(y2,NFFT));             % 左声道 FFT 计算
            A_FFT2 = Y_fft2 * 2 / NFFT;             % 转换为幅值
            A_FFT2(1) = 0;                          % 忽略直流分量的影响
            f = (0:(NFFT/2)) * dest_FS / NFFT;      % 频率范围,横坐标(半边谱)
    
            plot(f ,A_FFT2(1:NFFT/2 +1));           % 描绘 FFT 图像
            axis(f_axis);                           % 根据实际情况,限制可显示区间
            xlabel('频率/Hz');ylabel('振幅');
            title('右声道生成波形频谱')
        end    
    end
    

    ————————————————
    版权声明:本文为CSDN博主「Mr-Ma Technology」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_29225913/article/details/105445028

    展开全文
  • 如何实现在直播播放音频文件

    千次阅读 多人点赞 2021-03-03 10:42:24
    在我们看直播的时候,经常会在直播过程听到有掌声、口哨声、背景音乐等音效,那么这些声音...为此anyRTC提供了以下两种方法满足用户播放音效和其他音频文件的需求。 如何播放音效文件 音效就是指由声音所制造的效果,
  • 做灯光渲染时,经常需要exr图片转jpg操作,exr拥有多个分层通道,一般的图片浏览器都无法正常预览。在网上淘了一下发现了file-converter ...安装完成后,框选所有exr图片,在右键菜单,选择to jpg ,完了就这么简单。
  • RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体...音频视频交错格式数据 .AVI 波形格式数据 .WAV 位图数据格式 .RDI MIDI格式数据 .RMI 调色板...
  • AMR音频文件格式分析

    2017-06-24 19:57:00
    AMR音频文件格式分析1 概述 如今非常多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式.AMR,全称是:Adaptive Multi-Rate,自适应多速率,是一种音频编码文件格式,专...
  • Linux运行dat文件格式

    2021-05-10 07:19:17
    广告100%的CPU性能,计算能力不会降低!选择最主流的云服务器来满足各种业务需求,有数百种流行的云... 如下图所示: 导出格式分析记录导出支持三种文件格式,分别是文本,表格和区域文件. 以domain.com域名为例,导...
  • html5 audio(音频)标签的使用及支持的视频格式HTML5 提供了播放音频文件的标准。互联网上的音频直到现在,仍然不存在一项旨在网页上播放音频的标准。今天,大多数音频是通过插件(比如 Flash)来播放的。然而,并非...
  • RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构。RIFF文件所包含的数据...音频视频交错格式数据 .AVI 波形格式数据 .WAV ...
  • ACC(Advanced Audio Coding,高级音频编码)是杜比实验室为音乐社区提供的技术。,出现于1997年,基于MPEG-2的音频编码技术。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于...
  • 都必须以一定的格式来组织和存储起来,然后其它的软件再以相同的协议规则,相应的格式才能去打开解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 YUV、Bitmap,而对于音频来说,最简单常见的格式就是 ...
  • 音频封装格式——AAC

    千次阅读 2016-10-16 11:13:57
    一.AAC概述 ... AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代
  • 常见音频编码格式解析

    万次阅读 多人点赞 2017-12-15 11:22:06
    常见音频编码格式解析常见音频编码格式解析 MP3编码格式 1MP3概述 2MPEG音频压缩基础 3MPEG Layer3编解码的基本原理 4整个MP3文件结构 ...51AAC音频格式有ADIFADTSLATM 52ADIF和ADTS的header 53ADIF和
  • 音频格式与编码的理解

    千次阅读 2013-10-06 10:12:51
    原文链接地址:http://www.raywenderlich.com/204/audio-101-for-iphone-developers-file-and-data-formats ... 在做iphone开发之前,我(ray)声音格式了解的相当少。我知道一些“wav”和“mp3”声音
  • 文件格式、后缀名、图片格式详解

    千次阅读 2019-03-12 08:51:19
    .acm:音频压缩管理驱动程序,为Windows系统提供各种声音格式的编码和解码功能 .aif:声音文件,支持压缩,可以使用WindowsMediaPlayer和QuickTimePlayer播放 .AIF:音频文件,使用WindowsMediaPlayer播放 .AIFC:...
  • 音频基础概念及常见编码格式

    千次阅读 2018-09-11 23:17:33
    声音是由物体振动而产生的 声波的三要素 声波的三要素是频率、振幅和波形,频率代表音阶的高低,振幅代表...原理是用一个固定的频率模拟信号进行采样,采样后的信号在波形上看就像一串连续的幅值不一的脉冲(脉...
  • ARFF文件格式

    千次阅读 2021-02-11 02:46:11
    Attribute -Relation File Format (ARFF)1、ARFF 头章节包括关系声明和属性声明关系声明(@ralation Declaration)关系声明在ARFF文件的第一行定义。格式如下:@relation 是一个字符串。如果名字包含空格,那么这个...
  • MKV 文件格式解析

    千次阅读 2021-02-23 09:27:54
    但Matroska媒体格式除了MKV外,常见的还有MKA (Matroska Audio File)单一音频文件,可以有多条及多种类型的音轨,MKS (Matroska Subtitles)字幕文件,Matroska来自于俄语,影射俄罗斯娃娃,就是下面这个啦,表示一...
  • 音频知识及音频格式详解 来源: 张超的日志 ============= 一、名词解释 ============= 【比特率】 这个词有多种翻译,比如码率等,表示经过编码(压缩)后的音频数据每秒钟需要用多少个比特来...
  • AAC 音频格式分析.

    千次阅读 2014-10-22 10:19:42
    AAC ADTS格式分析  2013-07-24 17:36:28| 分类: 音频|举报|字号 订阅 http://wiki.multimedia.cx/index.php?title=Understanding_AAC ...OUTLI
  • 描述MATLAB对音频的支持包括:读写常见的音频文件格式,例如WAV, AVI, FLAC, MP3, and MPEG-4 AAC使用PC声卡回放和记录音频文件Data Acquisition Toolbox和DSP System Toolbox包含更多关于音频分享和采集,包括低...
  • AAC音频格式分析与解码

    千次阅读 2016-07-23 16:17:34
    一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下。...AAC音频格式分析 AAC音频格式有ADIF和ADTS: ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的
  • WAV格式文件分析

    千次阅读 2022-03-16 14:10:09
    WAV格式文件分析 WAV格式简介 WAV格式组成 RIFF Chunk Format Chunk Data Chunk 8 bit 单声道 8 bit 双声道 16 bit 单声道 16 bit 双声道 大小端端序 实际文件分析 RIFF Chunk Format Chunk Data Chunk ...
  • 目前MP4的概念被炒得很火,也很乱。最开始MP4指的是音频(MP3的升级...但是这篇文章介绍的内容跟上面这些都无关,我们要讨论的是MP4文件封装格式,对应的标准为ISO/IEC 14496-12,即信息技术视听对象编码的第12部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,538
精华内容 11,815
关键字:

以下对音频格式文件的描述中