Package wave offers a simplified API
to read and write WAVE files by only allowing to work with samples directly. The
underlying package riff
contains implementations for a reader and a writer for RIFF files.
Create a new WAVE reader by wrapping it around an io.Reader, optionally a
buffered one.
r, err:=os.Open("audio.wav")
iferr!=nil {
log.Fatalf("could not open file: %v", err)
}
buf:=bufio.NewReader(r)
wavr, err:=wave.NewReader(buf)
iferr!=nil {
log.Fatalf("could not create wave reader: %v", err)
}Read the samples one by one or into a slice of integers. The wave.Reader skips
all non-data chunks.
for {
sample, err:=wavr.Sample()
iferr==io.EOF {
break
}
iferr!=nil {
log.Fatalf("could not read sample: %v", err)
}
fmt.Println(sample)
}samples, err:=wavr.Samples()
iferr!=nil {
log.Fatalf("could not read samples: %v", err)
}Create a new WAVE writer by wrapping it around an io.WriteSeeker. This one is
automatically buffered.
format:= wave.Format{
AudioFormat: 1,
NumChans: 2,
SampleRate: 44100,
ByteRate: 176400,
BlockAlign: 4,
BitsPerSample: 16,
}
samples:= []int{
0, 0, 5924, -3298, 4924, 5180, -1770, -1768,
-6348, -23005, -3524, -3548, -12783, 3354,
0, 0, 5924, -3298, 4924, 5180, -1770, -1768,
}
w, err:=os.Create("audio.wav")
iferr!=nil {
log.Fatalf("could not create file: %v", err)
}
deferw.Close()
wavw, err:=wave.NewWriter(w, format)
iferr!=nil {
log.Fatalf("could not create wave writer: %v", err)
}
deferwavw.Close()Write the samples one by one or as a slice of integers.
for_, s:=rangesamples {
iferr:=wavw.Sample(s); err!=nil {
log.Fatalf("could not write sample %d: %v", s, err)
}
}iferr:=wavw.Samples(samples); err!=nil {
log.Fatalf("could not write samples: %v", err)
}Before creating a new chunk, the current one has to be closed which automatically writes its size.