Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python(wave)을 사용하여 WAV 파일 읽기 및 쓰기

<시간/>

Python 표준 라이브러리의 웨이브 모듈은 오디오 WAV 형식에 대한 쉬운 인터페이스입니다. 이 모듈의 기능은 원시 형식의 오디오 데이터를 객체와 같은 파일에 쓰고 WAV 파일의 속성을 읽을 수 있습니다.

파일은 내장된 open() 함수와 마찬가지로 '쓰기' 또는 읽기 모드로 열리지만 웨이브 모듈에서는 open() 함수로 열립니다.

wave.open()

이 기능은 오디오 데이터를 읽고 쓰기 위해 파일을 엽니다. 함수에는 두 개의 매개변수가 필요합니다. 첫 번째는 파일 이름이고 두 번째는 모드입니다. 모드는 오디오 데이터 쓰기를 위한 'wb' 또는 읽기를 위한 'rb'일 수 있습니다.

obj = wave.open('sound.wav','wb')

'rb' 모드는 Wave_read 개체를 반환하고 'wb' 모드는 Wave_write 개체를 반환합니다.

Wave_write 개체에는 다음 메서드가 있습니다.

닫기() Wave로 파일을 연 경우 파일을 닫습니다.
setnchannels() 채널 수를 설정합니다. 모노용 1개 스테레오 채널용 2
setsampwidth() 샘플 너비를 n바이트로 설정합니다.
setframerate() 프레임 속도를 n으로 설정합니다.
setnframes() 프레임 수를 n으로 설정합니다.
setcomptype() 압축 유형 및 설명을 설정합니다. 현재 NONE 압축 유형만 지원되며 이는 압축이 없음을 의미합니다.
setparams() 매개변수 튜플(nchannels, sampwidth, framerate, nframes, comptype, compname) 허용
말() 파일의 현재 위치 검색
writeframesraw() 수정하지 않고 오디오 프레임을 작성합니다.
쓰기 프레임() 오디오 프레임을 작성하고 올바른지 확인하십시오.

다음 코드는 99999초 길이의 짧은 정수 바이트 임의의 WAV 파일을 생성합니다.

import wave, struct, math, random
sampleRate = 44100.0 # hertz
duration = 1.0 # seconds
frequency = 440.0 # hertz
obj = wave.open('sound.wav','w')
obj.setnchannels(1) # mono
obj.setsampwidth(2)
obj.setframerate(sampleRate)
for i in range(99999):
   value = random.randint(-32767, 32767)
   data = struct.pack('<h', value)
   obj.writeframesraw( data )
obj.close()

Wave_read 개체 메서드

닫기() 스트림이 웨이브 모듈에 의해 열린 경우 스트림을 닫습니다.
getnchannels() 오디오 채널 수를 반환합니다(모노의 경우 1, 스테레오의 경우 2).
getsampwidth() 샘플 너비를 바이트 단위로 반환합니다.
getframerate() 샘플링 빈도를 반환합니다.
getnframes() 오디오 프레임 수를 반환합니다.
getcomptype() 압축 유형을 반환합니다('NONE'만 지원됨).
getparams() get*() 메서드의 출력과 동일한 명명된 튜플()(nchannels, sampwidth, framerate, nframes, comptype, compname)을 반환합니다.
읽기 프레임(n) 바이트 개체로 최대 n 프레임의 오디오를 읽고 반환합니다.
되감기() 파일 포인터를 오디오 스트림의 시작 부분으로 되감습니다.

다음 코드는 WAV 파일의 일부 매개변수를 읽습니다.

import wave
obj = wave.open('sound.wav','r')
print( "Number of channels",obj.getnchannels())
print ( "Sample width",obj.getsampwidth())
print ( "Frame rate.",obj.getframerate())
print ("Number of frames",obj.getnframes())
print ( "parameters:",obj.getparams())
obj.close()

출력

Number of channels 1
Sample width 2
Frame rate. 44100
Number of frames 99999
parameters: _wave_params(nchannels=1, sampwidth=2, framerate=44100, nframes=99999, comptype='NONE', compname='not compressed')