How to play an audiofile with pyaudio?

前端 未结 2 584
故里飘歌
故里飘歌 2020-12-17 01:16

I do not understand the example material for pyaudio. It seems they had written an entire small program and it threw me off.

How do I just play a single audio file?

相关标签:
2条回答
  • 2020-12-17 01:33

    May be this small wrapper (warning: created on knees) of their example will help you to understand the meaning of code they wrote.

    import pyaudio
    import wave
    import sys
    
    class AudioFile:
        chunk = 1024
    
        def __init__(self, file):
            """ Init audio stream """ 
            self.wf = wave.open(file, 'rb')
            self.p = pyaudio.PyAudio()
            self.stream = self.p.open(
                format = self.p.get_format_from_width(self.wf.getsampwidth()),
                channels = self.wf.getnchannels(),
                rate = self.wf.getframerate(),
                output = True
            )
    
        def play(self):
            """ Play entire file """
            data = self.wf.readframes(self.chunk)
            while data != '':
                self.stream.write(data)
                data = self.wf.readframes(self.chunk)
    
        def close(self):
            """ Graceful shutdown """ 
            self.stream.close()
            self.p.terminate()
    
    # Usage example for pyaudio
    a = AudioFile("1.wav")
    a.play()
    a.close()
    
    0 讨论(0)
  • 2020-12-17 01:43

    The example seems pretty clear to me. You simply save the example as playwav.py call:

    python playwav.py my_fav_wav.wav

    The wave example with some extra comments:

    import pyaudio
    import wave
    import sys
    
    # length of data to read.
    chunk = 1024
    
    # validation. If a wave file hasn't been specified, exit.
    if len(sys.argv) < 2:
        print "Plays a wave file.\n\n" +\
              "Usage: %s filename.wav" % sys.argv[0]
        sys.exit(-1)
    
    '''
    ************************************************************************
          This is the start of the "minimum needed to read a wave"
    ************************************************************************
    '''
    # open the file for reading.
    wf = wave.open(sys.argv[1], 'rb')
    
    # create an audio object
    p = pyaudio.PyAudio()
    
    # open stream based on the wave object which has been input.
    stream = p.open(format =
                    p.get_format_from_width(wf.getsampwidth()),
                    channels = wf.getnchannels(),
                    rate = wf.getframerate(),
                    output = True)
    
    # read data (based on the chunk size)
    data = wf.readframes(chunk)
    
    # play stream (looping from beginning of file to the end)
    while data != '':
        # writing to the stream is what *actually* plays the sound.
        stream.write(data)
        data = wf.readframes(chunk)
    
    # cleanup stuff.
    stream.close()    
    p.terminate()
    
    0 讨论(0)
提交回复
热议问题