2016-04-16 9 views
0

Ich versuche eine .WAV-Datei zu streamen, während beide einen der Soundkanäle entfernen, so dass er nur auf einem Lautsprecher abgespielt wird und gleichzeitig die Lautstärke reduziert wird.Ändern der Lautstärke beim Streamen mit PyAudio

Der Grund, warum ich PyAudio bin ist, dass ich in der Lage sein müssen

  • -Stream mehrere Dateien auf einmal
  • Sound abspielen aus spezifischen Lautsprecher (links/rechts)
  • Interrupt das Spiel von Sound-Dateien

und konnte keine anderen Python-Bibliotheken finden, die diese Funktionen erlaubt.

Ich habe den folgenden Code, von PyAudio Streaming-Beispiel geändert. Es spielt eine WAV-Datei von einem Lautsprecher ab, aber ich konnte keine Möglichkeit finden, die Lautstärke irgendwie zu verändern.

"""PyAudio Example: Play a wave file.""" 

import pyaudio 
import wave 
import sys 

CHUNK = 1024 

if len(sys.argv) < 2: 
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0]) 
    sys.exit(-1) 

wf = wave.open(sys.argv[1], 'rb') 

# instantiate PyAudio (1) 
p = pyaudio.PyAudio() 

# open stream (2) 
sampwidth = wf.getsampwidth() 
stream = p.open(format=p.get_format_from_width(sampwidth), 
       channels=wf.getnchannels(), 
       rate=wf.getframerate(), 
       output=True) 

# read data 
data = bytearray(wf.readframes(CHUNK)) 

# play stream (3) 
while len(data) > 0: 
    #remove left channel 
    for i in range(0, len(data)): 
     if i % (sampwidth*2) < sampwidth: 
      data[i] = 0 

    #reduce volume by 50% 
    for i in range(0, len(data)): 
     # use magic??? 
     pass 

    stream.write(bytes(data)) 
    data = wf.readframes(CHUNK) 
    if len(data) > 0: 
     data = bytearray(data) 

# stop stream (4) 
stream.stop_stream() 
stream.close() 

# close PyAudio (5) 
p.terminate() 

Wenn mir jemand irgendwelche Hinweise geben kann, würde ich es begrüßen. Ich denke, die Antwort wird ein besseres Verständnis darüber erfordern, wie die WAV-Dateien formatiert sind, als ich derzeit habe. Ich versuchte data[i] = int(data[i]/2) und andere ähnliche einfache Arithmetik, aber die Ausgabe wurde einfach verzerrt, was mir zeigt, dass das WAV-Dateiformat nicht so einfach ist, wie ich glaubte.

+1

Ihre einfache Arithmetik funktioniert nicht, weil 'data' ein' bytearray' ist und diese Operationen nicht definiert sind (und sie machen keinen Sinn, weil es nur Bytes und keine Zahlen sind). Sind Sie bereit, NumPy zu verwenden? Die Verwendung von NumPy-Arrays würde diese Art von Operationen ermöglichen. – Matthias

Antwort

0

Sie könnten zur Kasse gehen pydub. Es verwendet Pyaudio und hat eine einfache Methode, um Lautstärke zu ändern.