PyAudio 5.1-канальное (6-канальное) воспроизведение - PullRequest
0 голосов
/ 05 марта 2019

Кому-нибудь удалось воспроизвести каналы 5.1 с PyAudio?

Я написал программу для простого воспроизведения PCM (RAW, 16 бит / 48 кГц) со стандартного ввода.Предполагается использовать его как:

cat some_2ch.pcm | python my_player.py 1 2

  • Входной поток: some_2ch.pcm
  • Идентификатор устройства вывода: 1
  • ВыходКаналы: 2

cat some_6ch.pcm | python my_player.py 1 6

  • Входной поток: some_6ch.pcm
  • Идентификатор устройства вывода: 1
  • Выходные каналы:6

Я пытался воспроизвести 2, 4, 6 каналов с помощью этой программы, но она не работает при воспроизведении 6 каналов.Шумы во всех каналах, и они заставляют меня едва слышать музыку.

Поскольку проблема возникает только при 6-канальном воспроизведении, я подозревал, что моя звуковая карта работает неправильно, и попробовал другие звуковые карты, но появились шумы.

Я подтвердил, что мой файл PCM нормальный.(Я импортирую его в Audacity, и шума нет.)

Среда:

  • Windows 8.1 и Debian 9
  • Python 3.7.2
  • PyAudio 0.2.11
  • PortAudio v19
  • 7.1-канальное звуковое USB-устройство (CMedia CM6206)
  • 7.1-канальное встроенное звуковое устройство (Realtek ALC892)

Программа: my_player.py

import sys
import pyaudio


class MyPlayer(object):

    def __init__(self, device_id, channels):
        self.pcm_bit = pyaudio.paInt16
        self.pcm_rate = 48000
        self.dev_output = device_id
        self.buf_size = 1024 * channels
        self.channels = channels

    def play(self):
        pa = pyaudio.PyAudio()
        stream = pa.open(format=self.pcm_bit,
                         rate=self.pcm_rate,
                         channels=self.channels,
                         frames_per_buffer=self.buf_size,
                         input=False,
                         output=True,
                         output_device_index=self.dev_output)

        stream.start_stream()

        # read data from stdin and play them
        while stream.is_active():
            buffer = sys.stdin.buffer.read(self.buf_size)
            if len(buffer) == 0:
                break
            stream.write(buffer)

        stream.stop_stream()
        stream.close()
        pa.terminate()


if __name__ == '__main__':

    # usage: python my_player.py OUTPUT_DEVICE_ID CHANNELS
    # example: cat audio6ch.pcm | python my_player.py 1 6
    dev = int(sys.argv[1])
    c = int(sys.argv[2])
    mp = MyPlayer(dev, c)
    mp.play()
...