音频文件PCM、WAV、MP3的区别以及文件合并

 一、数字音频三要素

1.采样率

采样率即采样频率,指的一秒内的采样次数,它反映了采样点之间的间隔大小。常说的 44.1KHz 采样率,也即 1 秒采集了 44100 个样本。间隔越小,丢失的信息越少,数字声音就越逼真细腻,要求的存储量也就越大。由于计算机的工作速度和存储容量有限,而且人耳的听觉上限为20kHz,所以采样频率不可能也不需要太高。根据奈奎斯特采样定律,只要采样频率高于信号中最高频率的两倍,就可以从采样中恢复原始的波形。因此,40kHz以上的采样频率足以使人满意。

在实际应用中,我们为了平衡带宽和音质,不同场景往往会有不同的选择。常见的选择如下:

 2.采样位深

位深又叫做量化位数、采样位数、分辨率,它是指声音的连续强度被数字表示后可以分为多少级。N-bit的意思声音的强度被均分为2^N级。16-bit的话,就是65535级。这是一个很大的数了,人可能也分辨不出六万五千五百三十五分之一的音强差别。也可以说是声卡的分辨率,它的数值越大,分辨率也就越高,所发出声音的能力越强。原则上,这个值也是大一些比较好,但是记录的数据量也会成倍增长。

和采样率的选择类似,虽然理论上来说位深越大越好,但是综合带宽、存储、实际听感的考虑,我们应该为不同场景选用不同的位深:

3.声道数

声音记录只产生一个波形,称为单声道。声音记录只产生两个波形,称为立体声双道(最基本的立体声是两声道:左声道、右声道)。立体声比单声道声音丰满、空间感强,但需要两倍的存储空间。

二、音频码率

数字音频的三要素不仅影响音频质量,也会影响音频存储、传输所需的空间、带宽。而实际应用场景下,音质决定用户体验、带宽决定成本,都是我们必须考虑到。音质可能更多是主观上的感受,但带宽、空间是比较容易量化的,我们需要了解音频码率的概念。

音频码率,又称为比特率,指的是单位时间内(一般为1s)所包含的音频数据量,可以通过公式计算。比如采样率 44.1KHz,位深16bit的双声道音频PCM数据,它的原始码率为:

原始码率 = 采样率/s x 位深/bit x 声道数 x 时长(1s)=44.1x1000x16x2x1 = 1411200 bps = 1411.2 kbps = 1.411 Mbps (需要注意单位之间的差异和转换,b=bit)

如果一个PCM文件时长为1分钟,则传输/存储这个文件需要的数据量为:1.411 Mbps * 60s = 86.46Mb。

需要注意的是,上述计算结果是未经压缩的、原始音频PCM数据的码率。RTC场景下,往往还需要再使用 AAC、OPUS 等编码算法做编码压缩,进一步减小带宽、存储的压力。码率的选择也是一个综合质量和成本的博弈,以后我们会详细讲解音频编码的知识,此处大家先了解即可。

三、wav、mp3、pcm文件的组成部分

1.wav文件格式

wav是一种无损的音频文件格式,wav文件格式是用于多媒体文件存储的微软RIFF规范的一个子集。一个RIFF文件从一个文件头开始,后面是一系列的数据块。一个wav文件通常只是一个带有单一"WAVE"块的RIFF文件。"WAVE"块是由两个子块组成的,一个是指定数据格式的“fmt”块和另一个是包含实际样本数据的数据块。这种形式被称为是“规范形式”("Canonical form")。具体格式如图所示:

上图中的data区域就是就是真正的数据部分,data上面的44字节是文件头,其文件头格式可以用下面的结构体表示:

typedef struct WAV_HEADER_S
{  
    char            riffType[4];    //4byte,资源交换文件标志:RIFF     
    unsigned int    riffSize;       //4byte,从下个地址到文件结尾的总字节数   
    char            waveType[4];    //4byte,wav文件标志:WAVE      
    char            formatType[4];  //4byte,波形文件标志:FMT(最后一位空格符)   
    unsigned int    formatSize;     //4byte,音频属性(compressionCode,numChannels,sampleRate,bytesPerSecond,blockAlign,bitsPerSample)所占字节数  
    unsigned short  compressionCode;//2byte,格式种类(1-线性pcm-WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM)  
    unsigned short  numChannels;    //2byte,通道数  
    unsigned int    sampleRate;     //4byte,采样率  
    unsigned int    bytesPerSecond; //4byte,传输速率  
    unsigned short  blockAlign;     //2byte,数据块的对齐,即DATA数据块长度  
    unsigned short  bitsPerSample;  //2byte,采样精度-PCM位宽  
    char            dataType[4];    //4byte,数据标志:data  
    unsigned int    dataSize;       //4byte,从下个地址到文件结尾的总字节数,即除了wav header以外的pcm data length  
}WAV_HEADER;  

2.pcm文件格式

PCM(Pulse Code Modulation----脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。在音视频中,PCM是一种用数字表示采样模拟信号的方法。

3.mp3文件格式

MP3是一个数据压缩格式,

4.wav与pcm文件的相互转换

WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。

简单来说:pcm是无损wav文件中音频数据的一种编码方式,但wav还可以用其它方式编码。

(1)wav转pcm,原理就是将文件头去掉,数据转成int型即可。

(2)pcm转wav,原理就是利用wave库,添加通道信息、采样位数、采样率等信息作为文件头,pcm数据直接写入即可。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用Python读写PCM WAV文件,可以使用Python的标准库中的`wave`模块。以下是一个简单的示例代码,可以帮助您读取和写入PCM WAV文件。 ```python import wave # 打开PCM WAV文件进行读取 with wave.open('input_file.wav', 'rb') as input_file: # 获取音频文件参数 sample_width = input_file.getsampwidth() # 样本宽度(以字节为单位) num_channels = input_file.getnchannels() # 声道数 sample_rate = input_file.getframerate() # 采样率 num_frames = input_file.getnframes() # 采样帧数 # 读取PCM数据 pcm_data = input_file.readframes(num_frames) # 打开PCM WAV文件进行写入 with wave.open('output_file.wav', 'wb') as output_file: # 设置音频文件参数 output_file.setsampwidth(sample_width) output_file.setnchannels(num_channels) output_file.setframerate(sample_rate) output_file.setnframes(num_frames) # 写入PCM数据 output_file.writeframes(pcm_data) ``` 在上述代码中,`wave`模块中的`open()`函数用于打开PCM WAV文件进行读取或写入。`'rb'`和`'wb'`参数分别表示读取和写入二进制文件。使用`get*()`方法可以获取音频文件的各种参数,如样本宽度、声道数、采样率和采样帧数等。使用`readframes()`和`writeframes()`方法可以读取和写入PCM数据。 ### 回答2: 在Python中,可以使用`wave`库来实现PCMWAV文件的读写。 首先,要读取PCM文件,需要使用`wave`库中的`open()`函数打开PCM文件,并利用`readframes()`函数读取PCM数据。具体的代码如下: ```python import wave pcm_file = wave.open('input.pcm', 'rb') # 获取PCM文件的参数 params = pcm_file.getparams() # 读取PCM数据 pcm_data = pcm_file.readframes(params.nframes) pcm_file.close() ``` 对于WAV文件的写入,同样需要使用`wave`库中的`open()`函数来打开新的WAV文件,并设置参数。然后使用`writeframes()`函数将PCM数据写入WAV文件中。具体的代码如下: ```python import wave pcm_file = wave.open('input.pcm', 'rb') wav_file = wave.open('output.wav', 'wb') # 设置WAV文件的参数 wav_file.setparams(pcm_file.getparams()) # 写入PCM数据到WAV文件 wav_file.writeframes(pcm_file.readframes(pcm_file.getnframes())) pcm_file.close() wav_file.close() ``` 以上就是使用Python实现PCMWAV文件的读写的方法。需要注意的是,读写前要先导入`wave`库,并且读取时需要注意PCM数据的编码格式。 ### 回答3: 在Python中,我们可以使用第三方库来实现PCM WAV文件的读写。下面是一个简单的例子: 1. 首先,我们需要安装`wave`库,它提供了WAV文件的读写功能。可以使用以下命令安装该库: ``` pip install wave ``` 2. 读取PCM WAV文件: ```python import wave # 打开PCM WAV文件 with wave.open("input.wav", "rb") as wav_file: # 获取音频参数 channels = wav_file.getnchannels() sample_width = wav_file.getsampwidth() sample_rate = wav_file.getframerate() num_frames = wav_file.getnframes() # 读取所有音频数据 frames = wav_file.readframes(num_frames) # 打印音频参数 print("Channels:", channels) print("Sample Width:", sample_width) print("Sample Rate:", sample_rate) # 将音频数据写入输出PCM WAV文件 with wave.open("output.wav", "wb") as wav_file: # 设置音频参数 wav_file.setnchannels(channels) wav_file.setsampwidth(sample_width) wav_file.setframerate(sample_rate) # 写入音频数据 wav_file.writeframes(frames) ``` 在上面的示例中,我们使用`wave.open()`函数打开PCM WAV文件,并使用`readframes()`方法读取所有音频数据。然后,我们可以使用`getnchannels()`、`getsampwidth()`和`getframerate()`方法获取音频参数,并使用`setnchannels()`、`setsampwidth()`和`setframerate()`方法设置输出文件音频参数。最后,使用`writeframes()`方法将音频数据写入输出PCM WAV文件。 注意:在使用本示例代码之前,请确保你有一个名为`input.wav`的PCM WAV文件,并且它的参数与示例代码中的参数匹配。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值