2016-04-16 19 views
0

我正在嘗試流式傳輸.WAV文件,同時剝去其中一個聲道,因此它只能在一個揚聲器上播放,同時還會減小音量。使用PyAudio流式傳輸時修改音量

我使用PyAudio的原因是,我將必須能夠

  • 流多文件一次
  • 播放聲音了具體的揚聲器(左/右)
  • 中斷播放的的聲音文件

並無法找到任何其他允許這些功能的Python庫。

我有以下代碼,從PyAudio的流示例修改。它從一個揚聲器播放WAV文件,但我無法找到以任何方式修改音量的方法。

"""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() 

如果有人能給我任何指針,我將不勝感激。我覺得答案需要更好地理解WAV文件格式化的方式,而不是我目前擁有的格式。我試過data[i] = int(data[i]/2)和其他類似的簡單算法,但輸出結果只是失真,這說明WAV文件格式並不像我想象的那麼簡單。

+1

你的簡單算術不起作用,因爲'data'是一個'bytearray',並且這些操作沒有被定義(並且它們沒有意義,因爲它只是字節,而不是數字)。你願意使用NumPy嗎?使用NumPy數組可以使這些操作成爲可能。 – Matthias

回答

0

您可能想結算pydub。它使用pyaudio並有一個簡單的方法來改變音量。