Instruções para mixar dois fluxos de áudio

Instruções para mixar dois fluxos de áudio

Para uma configuração de transmissão, gostaria de mixar o áudio de um dispositivo de entrada com o áudio de um arquivo .wav. O arquivo .wav contém uma música de introdução, espera ou saída que eu gostaria de adicionar à música em algum momento durante a transmissão.

A seguinte configuração é o objetivo: insira a descrição da imagem aqui

Existem várias etapas necessárias:

  1. adicionar/misturar dois fluxos
  2. converter para mono (ou talvez isso devesse ter sido feito primeiro)
  3. divida os streams para um stream de transmissão e um medidor VU
  4. envie o stream para a saída de áudio local

Tenho certeza de que isso deve ser possível, mas ainda não consegui encontrar nenhuma solução na internet. Explorar o .asoundrc do alsa ainda não produziu nenhum resultado. Parece que alsa dmix faz algumas mixagens, mas não é o que eu quero aqui....

Eu realmente não sei por onde começar.

Alguém pode lançar alguma luz sobre isso? Uma solução parcial também seria adequada!

Responder1

A maneira mais fácil é usar o Pulseaudio. (Você pode fazer isso com ALSA, mas será difícil configurar.)

Tudo o que produz som é mixado automaticamente na saída atual ("sink" nos termos do Pulseaudio), então você não precisa se preocupar com a mixagem. Você pode controlar os volumes com pavucontrole ele lembra o último volume pelo nome do aplicativo. Você pode usar paplaypara reproduzir arquivos wav a partir da linha de comando, mas qualquer outro reprodutor de áudio também serve.

A conversão para mono será feita automaticamente se o seu coletor for mono. Se você não pode configurar o coletor RaspPi local para isso (não sei, não possuo um RaspPi), você pode adicionar um coletor "pseudo" com

pactl load-module module-null-sink sink_name=whatever

ou se você precisar remapear no Pulseaudio module-remap-sink(veja abaixo, ainda não tentei fazer isso).

Este coletor ou o coletor RaspPi local terá uma .monitorfonte associada que você pode usar para distribuí-lo para icecast, etc.

Você pode configurar um feed permanente da entrada hw:1 nos coletores escolhidos com

pacmd load-module module-loopback source="alsa_input.name_of_hw_1" sink="whatever_or_local_sink"

Você pode listar os nomes de coletores disponíveis com

pacmd list-sinks | grep name:

Como argumentos, use o nome sem colchetes angulares.

Acho que isso é o básico. Leia sobre o Pulseaudio disponívelmódulos, e pacmd helpdirá o que você pode fazer na linha de comando, se não quiser usar pavucontrol.

EditarparaALSA:

Primeiro, leia sobre os disponíveisplug-ins. Você precisará de uma "placa de som virtual" para rotear o áudio para o darkice etc. Esse é um módulo do kernel, então faça algo como

sudo modprobe snd-aloop pcm_substreams=2

para teste e coloque um arquivo /etc/modprobe.dquando funcionar. Digamos que o loopback seja hw:3,*,*.

No lado de entrada da placa de som virtual, você precisará de algo como

dmix "main_in" --> plug (slave.channels = 1) --> hw:3,0,0

Então você pode aplay -D main_in sound.wav, e correr

alsaloop -C hw:0 -P main_in

para conectá-lo ao captador de áudio.

No lado de saída da placa de som virtual, algo como

hw:3,1,0 --> dsnoop "main_out"

e monitorá-lo na saída de áudio local, novamente

alsaloop -C main_out -P local_audio_out

Você pode então executar darkiceo medidor VU diretamente no main_out. Aliás, arecord -D main_out -d 0 -vv /dev/nullé um bom medidor VU para testes.

Leia detalhes sobre a sintaxe no link acima, não vou tentar fazer isso. As -->setas indicam as relações mestre/escravo do plugin. A latência provavelmente será horrível, com um loopback através do espaço do kernel e muitos aplicativos do espaço do usuário.

Se o Pulseaudio não funcionar para você, uma alternativa é jack, mas não tenho experiência em configurá-lo.

informação relacionada