Стрим транскодирует и труба работает только в первый раз - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь воспроизвести несколько аудиопотоков (друг за другом) на импульсном аудио устройстве.Однако только первый поток фактически делает его доступным для устройства.

Код прослушивает голосовой канал Discord и создает необработанный аудиопоток (PCM) для каждого разговора.Затем он передает поток через транскодер ( sox-stream ) и к аудиоустройству с модулем, называемым speaker :

conn.on('speaking', (user, speaking) => {
  if (speaking) {
    console.log(`I'm listening to ${user}`);
    const audioStream = receiver.createPCMStream(user);

    // This works for every time someone speaks.
    audioStream.pipe(generateOutputFile()); // generateOutputFile returns a writeStream to a file.

    // This only works for the first time someone speaks after the script is initiated. 
    audioStream.pipe(
      sox({ // sox-stream package
        global: { G: true ,  guard: true, 'no-dither': true },
        input: {type: 'raw', e:'signed', bits: 32, endian: 'little', rate: 48000, channels: 1},
        output: {type: 'raw', bits: 16,  endian: 'little', e: 'signed', rate: 44100 , channels:2},
    }))
    .pipe(speaker); // speaker package with libpulse back-end
  }
});

Динамик определяется как:

const speaker = new Speaker({
  channels: 2,          // 2 channels
  bitDepth: 16,         // 16-bit samples
  sampleRate: 44100,     // 44,100 Hz sample rate
  device: 'test1'
});

Интересно то, что я добавил audioStream.pipe(generateOutputFile()); для записи необработанного аудио в файл PCM, и это работает для каждого потока.Даже audioStream.pipe(sox(options)).pipe(generateOutputFile()) работает для каждого потока.Это заставляет меня поверить, что проблема в том, что speaker не обрабатывает несколько потоков так, как мне хотелось бы.

Любые указания относительно того, почему это происходит, были бы очень полезны!

...