Instruções para mixar dois fluxos de áudio

2

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

A seguinte configuração é o objetivo:

Existem vários passos necessários:

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

Tenho certeza de que isso deve ser possível, mas ainda não encontrei nenhuma solução na internet. Cavar no .asoundrc de alsa ainda não produziu nenhum resultado. Parece que alsa dmix faz alguma mixagem, mas não o que eu quero aqui ....

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

Alguém por favor pode lançar alguma luz sobre isso? Uma solução parcial também estaria bem!

    
por Arnold 10.04.2017 / 18:00

1 resposta

1

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

Tudo o que produz som é automaticamente misturado na saída atual ("sink" em termos de Pulseaudio), então você não precisa se preocupar com a mixagem. Você pode controlar volumes com pavucontrol e lembra o último volume pelo nome do aplicativo. Você pode usar paplay para reproduzir arquivos wav a partir da linha de comando, mas qualquer outro audioplayer também fará isso.

A conversão para mono será feita automaticamente se seu coletor for mono. Se você não puder 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).

Esse coletor ou o coletor RaspPi local terá uma fonte .monitor associada que você pode usar para distribuir para o icecast, etc.

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

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

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

pacmd list-sinks | grep name:

Como argumentos, use o nome sem os colchetes angulares.

Eu acho que isso é o básico. Leia sobre os módulos disponíveis do Pulseaudio e pacmd help dirá o que você pode faça na linha de comando, se você não quiser usar pavucontrol .

Editar para ALSA :

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

sudo modprobe snd-aloop pcm_substreams=2

para testar e colocar um arquivo em /etc/modprobe.d quando ele funcionar. Diga que o loopback é hw:3,*,* .

No lado da 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 executar

alsaloop -C hw:0 -P main_in

para conectá-lo ao gravador de áudio.

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

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

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

alsaloop -C main_out -P local_audio_out

Você pode executar darkice e o medidor VU diretamente em main_out . BTW, arecord -D main_out -d 0 -vv /dev/null é um bom VU-meter para testes.

Leia os 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 por meio do espaço do kernel e muitos aplicativos de 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.

    
por 10.04.2017 / 20:40