title: Python: How to decode a mp3 chunk into PCM samples?
body: <p>I'm trying to catch chunks of an mp3 webstream and decoding them into PCM samples for signal processing. I tried to catch the audio via requests and io.BytesIO to save the data as .wav file.</p>
  
  <p>I have to convert the mp3 data to wav data, but I don't know how. (My goal is not to record a .wav file, i am just doing this to test the algorithm.)</p>
  
  <p>I found the pymedia lib, but it is very old (last commit in 2006), using python 2.7 and for me not installable.</p>
  
  <p>Maybe it is possible with ffmpeg-python, but I have just seen examples using files as input and output. </p>
  
  <p>Here's my code:</p>
  
  <pre><code>import requests
  import io
  import soundfile as sf
  import struct
  import wave
  import numpy as np
  
  
  def main():
      stream_url = r'http://dg-wdr-http-dus-dtag-cdn.cast.addradio.de/wdr/1live/diggi/mp3/128/stream.mp3'
      r = requests.get(stream_url, stream=True)
      sample_array = []
      try:
          for block in r.iter_content(1024):
              data, samplerate = sf.read(io.BytesIO(block), format="RAW", channels=2, samplerate=44100, subtype='FLOAT',
                                         dtype='float32')
              sample_array = np.append(sample_array, data)
  
      except KeyboardInterrupt:
          print("...saving")
          obj = wave.open('sounds/stream1.wav', 'w')
          obj.setnchannels(1)  # mono
          obj.setsampwidth(2)  # bytes
          obj.setframerate(44100)
  
          data_max = np.nanmax(abs(sample_array))
  
          # fill WAV with samples from sample_array
          for sample in sample_array:
              if (np.isnan(sample) or np.isnan(32760 * sample / data_max)) is True:
                  continue
              try:
                  value = int(32760 * sample / data_max)  # normalization INT16
              except ValueError:
                  value = 1
              finally:
                  data = struct.pack('&lt;h', value)
                  obj.writeframesraw(data)
  
          obj.close()
          print("end")
  
  
  if __name__ == '__main__':
      main()
  
  </code></pre>
  
  <p>Do you have an idea how to handle this problem?</p>