Open ghost opened 9 years ago
At present, all the encoders are implemented by "pulling" data from file-like PCMReaders rather than having data "pushed" into them. So the implementation of a signal processor looks a lot like:
class Processor:
def __init__(self, pcmreader):
"pcmreader is some other reader to be processed"
# assuming the stream's parameters won't be changed
self.sample_rate = pcmreader.sample_rate
self.channels = pcmreader.channels
self.channel_mask = pcmreader.channel_mask
self.bits_per_sample = pcmreader.bits_per_sample
# save reader to extract data from
self.pcmreader = pcmreader
def read(self, pcm_frames):
# grab data from reader and convert it to floats between (-1.0 - +1.0)
frame_list = self.pcmreader.read(pcm_frames).to_float()
# perform signal processing here...
# convert samples back to integers for the encoder
return frame_list.to_int(self.bits_per_sample)
def close(self):
# close our contained reader when done
self.pcmreader.close()
So encoding is then a matter of calling:
old_wave = audiotools.open("some_file.wav")
new_wave = audiotools.WaveAudio.from_pcm(filename, Processor(old_wave.to_pcm()))
Encoders check those 4 stream parameters (sample_rate
, bits_per_sample
, etc. - which are ints) to determine what the stream is. They then encode the data returned by .read()
until an empty FrameList is returned. Finally, .close()
is called to clean up any open file objects the stream might have.
Also, encoders aren't picky about how much data is returned by each .read()
call; they will break the stream into chunks as needed. All that matters is that the last FrameList is empty.
I hope this is of some use!
I worry this may be a slightly basic problem but I've been trying for days and cannot seem to find a solution in the documentation.
I am trying to use audiotools in python to open audio files (at the moment just .wav), apply signal processing to the PCM data, then save as a new file
I have managed to read the data and convert to a FramesList of floating point values which is perfect for editing, though I cannot work out the process of writing the processed FramesList back to a .wav file. to_bytes() converts the data into a raw pcm string but I am unsure how to get this raw data back into a wav file?