Я пытаюсь передать файл .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-файла не так прост, как я полагал.
Ваша простая арифметика не работает, потому что 'data' является' bytearray', и эти операции не определены (и они на самом деле не имеют смысла, потому что это просто байты, а не числа). Вы хотите использовать NumPy? Использование массивов NumPy сделает такие операции возможными. – Matthias