java中支持mp3格式_可以播放mp3格式文件的机器,都遵守了什么协议,才能让mp3格式的文件可以:“一处保存,到处播放?...

//题主修改了问题,第一段的立场就有点奇怪了 >_<.>

//不是mp3格式去适应各种机器的,是各种机器按照mp3规范通过硬件或软件去解码mp3格式的文件,然后经过DAC(数字->模拟转换器)、功放产生的声音。MP3规范保证,对于同一文件,按照规范解码声音文件,能获得相同的数字声音信息用于播放。

先不说mp3这种特殊的格式,我们说说声音(本来是个模拟信号,定义域值域都是连续的)是如何存储为数字信息的(录音的过程),然后又是怎么从数字信息转换成声音的(播放的过程)。最后再简单谈谈各种声音编码的作用是什么。

声音世界的数学原理

首先,声是一种振动波,任何一段音乐都可以用唯一的 y = f(t) 的函数表示,即声源位移随时间变化的函数。

首先我们假设我们可以用某种方法获取音乐在任何时刻的声音,即上述函数是已知的(后文我们会提到获取的方式是通过ADC)。但是,我们没有办法以数字的形式存储这个函数,因为它的定义域和值域都是连续的(这个函数既在无限个点有无规律的函数值,每个函数值又要用无限的bit位才能精确表示)。为了将物理量的声音数字化存储,这里我们有两个手段,采样和量化。

采样用于将定义域离散化,我们只存储这个函数在有限个点上的值。比如,一般音频信号的采样率是44.1 KHz, 即一秒中会采样44100次,记录每次采样时的位移。

量化用于将值域离散化,对于这个函数上我们每一个要采样的点,我们只存储有限精度的函数值。以一般音频的采样精度16bit为例,假设位移在[-32768.5, 32767.5]中(更大的位移可以通过缩放,或者饱和使函数值始终位于这个区间里),在每个采样点我们只近似到最接近整数,例如如果位移是12345.6789,我们只记录12346。在这种量化的手段下,任何一个采样点都可以用一个16位二进制数( 对应十进制中的-32768~32767) 表示。

通过上述手段,我们就把一个模拟量的声音转换成了数字信息:以一般音频为例,5 min音频需要存储 44.1KHz * 300s 数据点,每个数据点是一个16bit 二进制数。这个数字化的声音信号是原来模拟的声音信号的近似。根据香农-奎尼斯特采样定律,采样所丢失掉的声音频率高于22.05KHz, 人耳对这样的高频声音不敏感(约定俗成的敏感范围:20-20000Hz)。不知到有没有哪位大神愿意用有限字长去算一下由量化所带来误差,但是肯定也是很小的。

录音和播放

录音过程是模拟信号(声音)向数字信号(音频文件)转变的过程:

拾音器震动,经过压电传感器(或类似器件),将位移信号转化为电信号(注意此时仍然是模拟量)。然后经过模数转换器(ADC),在设定好的采样点采样+量化转化成可以存储的数字信号,存储下来。

播放过程是数字信号(音频文件)向模拟信号(声音)转变的过程:

读取音频文件,可以得到每个采样点的采样数值,经过数模转换器转换成模拟电信号,再经过某种由电压控制位移的振动器(有高人指出这就是扬声器),生成声音。

数字编码

最后我们说说各种声音编码如mp3,flac等究竟是怎么回事。

我们已经了解到,任何一段T s的音频,经过量化和采样,可以转化为 44100 * T个16 bit二进制数。

而声音编码所要处理的就是如何在存储介质中存储这些二进制数。我们先讨论无损编码,无损声音编码建立的就是这些二进制数和音频文件的双射。即在量化和采样获得这些44100*T 个16bit二进制数后,如何编码这些二进制数生成音频文件以存储在存储介质上,并且这个文件还能够唯一解码成原来的这些44100*T个16 bit二进制数,以供播放。

最naive的方法,按序以二进制文件的方式,存储这44100 * T个16 bit 二进制数。这样的好处是编码解码基本不消耗计算资源,坏处是因为没有任何压缩音频文件会很大。

于是种类繁多的无损音频编码就是在压缩率和需求的计算资源中作trade off, 尽可能的增大压缩率,但是又保证各种设备能有足够的计算资源来解压生成的音频文件回到那些16 bit二进制数。

而诸如mp3 这类的有损声音编码,就是在编码成音频文件后,并不能唯一得从音频文件解码得到原来的那些16 bit 二进制数,即小部分声音信息丢失,顾称为有损。但是这些编码往往能比无损编码获取更高的压缩率,或者对计算资源的需求更小。

在实际应用中,编码往往还会规定一些metadata(元数据)写在音频文件的头部,主要用于标记编码种类,音乐长度,以及作者、风格之类的信息。

一句话总结对于原问题的答案,任何一种音频格式建立了计算机文件和数字声音信息(或近似的数字声音信息,在有损编码的情况下)的双射,使得任何按照音频格式规范解码同一个声音文件能够得到同样的数字声音信息,经过数模转换生成同样的声音(忽略模拟设备误差)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值