2016-04-16 11 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 и имеет простой способ изменения громкости.