wave 模块

wave 模块提供了一个处理 WAV 声音格式的便利接口。它不支持压缩/解压,但是支持单声道/立体声。

wave 模块定义了以下函数和异常:

wave.open(file, mode=None)

如果 file 是一个字符串,打开对应文件名的文件。否则就把它作为文件类对象来处理。mode 可以为以下值:

# 只读模式
'rb'

# 只写模式
'wb'

注意:不支持同时读写WAV文件。

mode 设为 'rb' 时返回一个 Wave_read 对象,而 mode 设为 'wb' 时返回一个 Wave_write 对象。如果省略 mode 并指定 file 来传入一个文件类对象,则 file.mode 会被用作 mode 的默认值。

如果操作的是文件对象,当使用 wave 对象的 close() 方法时,并不会真正关闭文件对象,这需要调用文件对象的close()方法来关闭文件对象。

wave.openfp(file, mode)

open(),用于向后兼容。

Deprecated since version 3.7, will be removed in version 3.9.
exception wave.Error

当不符合WAV格式或无法操作时引发的错误。

一、Wave_read对象

open() 返回的 Wave_read 对象,有以下几种方法:

Wave_read.close()					# 关闭 `wave` 打开的数据流并使对象不可用。当对象销毁时会自动调用。
Wave_read.getnchannels()			# 返回声道数量(1 为单声道,2 为立体声)
Wave_read.getsampwidth()			# 返回采样字节长度
Wave_read.getframerate()			# 返回采样频率
Wave_read.getnframes()				# 返回音频总帧数
Wave_read.getcomptype()				# 返回压缩类型(只支持 'NONE' 类型)
Wave_read.getcompname()				# getcomptype() 的通俗版本。使用 'not compressed' 代替 'NONE'
Wave_read.getparams()				# 返回一个 namedtuple() (nchannels, sampwidth, framerate, nframes, comptype,compname),与 get*() 方法的输出相同
Wave_read.readframes(n)				# 读取并返回以 bytes 对象表示的最多 n 帧音频
Wave_read.rewind()					# 设置当前文件指针位置

下面是一个读取wav音频文件,并绘制wav文件的波形图的示例:

# -*- coding: utf-8 -*-
import os
import wave
import pylab as pl
import numpy as np


# 打开WAV文档
f = wave.open(r"1.wav", "rb")
fsize = os.path.getsize("1.wav")
print("fsize: ", fsize)

# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
# 通道数 采样字节长度 采样频率 总帧数(总的采样数)
params = f.getparams()

nchannels, sampwidth, framerate, nframes = params[:4]
print("nchannels: ", nchannels)
print("sampwidth: ", sampwidth)
print("framerate: ", framerate)
print("nframes: ", nframes)
# 读取波形数据,读取并返回以 bytes 对象表示的最多 n 帧音频。
str_data = f.readframes(nframes)
# print(str_data)
f.close()
# 将波形数据转换为数组
wave_data = np.fromstring(str_data, dtype=np.short)
# print(wave_data)
print("size : ", wave_data.size)
# for i in range(wave_data.size):
#     if i % 10 == 0:
#         print();
#     print(wave_data[i])
    
if nchannels == 2:
    wave_data.shape = -1, 2 
    wave_data = wave_data.T 
    time = np.arange(0, nframes) * (1.0 / framerate) 
    # 绘制波形 
    pl.subplot(211) 
    pl.plot(time, wave_data[0]) 
    pl.subplot(212) 
    pl.plot(time, wave_data[1], c="g") 
    pl.xlabel("time (seconds)") 
    pl.show()

elif nchannels == 1:
    wave_data.shape = -1, 1 
    wave_data = wave_data.T 
    time = np.arange(0, nframes) * (1.0 / framerate) 
    # 绘制波形 
    # pl.subplot(211) 
    pl.plot(time, wave_data[0], 'c') 
    pl.savefig("1.png")
    pl.xlabel("time (seconds)") 
    pl.show()

二、Wave_write 对象

Wave_write.close()					# 关闭 `wave` 打开的数据流并使对象不可用。当对象销毁时会自动调用。
Wave_write.setnchannels(n)			# 设置声道数量(1 为单声道,2 为立体声)
Wave_write.setframerate(n)			# 设置采样频率

你可能感兴趣的:(Python3,模块)