Für ein Broadcast-Setup möchte ich Audio von einem Eingabegerät mit Audio aus einer WAV-Datei mischen. Die WAV-Datei enthält eine Intro-, Warte- oder Exit-Musik, die ich irgendwann während der Sendung zur Musik hinzufügen möchte.
Es sind mehrere Schritte erforderlich:
- zwei Ströme hinzufügen/mischen
- in Mono umwandeln (oder vielleicht hätte dies zuerst getan werden sollen)
- Teilen Sie die Streams für einen Broadcast-Stream und ein VU-Meter auf
- Senden Sie den Stream an den lokalen Audioausgang
Ich bin ziemlich sicher, dass das möglich sein muss, aber ich konnte im Internet noch keine Lösung finden. Das Durchsuchen von Alsas .asoundrc hat noch kein Ergebnis gebracht. Es scheint, dass Alsa dmix einige Mixe durchführt, aber nicht das, was ich hier will....
Ich weiß wirklich nicht, wo ich anfangen soll.
Kann das bitte jemand aufklären? Eine Teillösung wäre auch ok!
Antwort1
Am einfachsten geht das mit Pulseaudio. (Sie können es auch mit ALSA machen, aber die Konfiguration wird mühsam.)
Alles, was Ton erzeugt, wird automatisch auf dem aktuellen Ausgang gemischt („Sink“ in Pulseaudio-Terminologie), sodass Sie sich nicht um das Mischen kümmern müssen. Sie können die Lautstärke mit steuern pavucontrol
, und es merkt sich die letzte Lautstärke anhand des Anwendungsnamens. Sie können paplay
WAV-Dateien über die Befehlszeile abspielen, aber jeder andere Audioplayer ist auch geeignet.
Die Konvertierung in Mono erfolgt automatisch, wenn Ihr Sink mono ist. Wenn Sie den lokalen RaspPi-Sink nicht dafür konfigurieren können (ich weiß es nicht, ich besitze keinen RaspPi), können Sie einen "Pseudo"-Sink hinzufügen mit
pactl load-module module-null-sink sink_name=whatever
oder wenn sich herausstellt, dass Sie in Pulseaudio eine Neuzuordnung vornehmen müssen module-remap-sink
(siehe unten, habe dies selbst noch nicht ausprobiert).
Dieser Sink oder der lokale RaspPi-Sink verfügt über eine zugehörige .monitor
Quelle, die Sie zum Verteilen an Icecast usw. verwenden können.
Sie können eine permanente Einspeisung des hw:1-Eingangs in die von Ihnen gewählten Senken einrichten mit
pacmd load-module module-loopback source="alsa_input.name_of_hw_1" sink="whatever_or_local_sink"
Sie können die verfügbaren Sink-Namen auflisten mit
pacmd list-sinks | grep name:
Verwenden Sie als Argumente den Namen ohne die spitzen Klammern.
Ich denke, das sind die Grundlagen. Lesen Sie mehr über die verfügbaren PulseaudioModule, und pacmd help
erklärt Ihnen, was Sie über die Befehlszeile tun können, wenn Sie nicht verwenden möchten pavucontrol
.
BearbeitenfürALSA:
Informieren Sie sich zunächst über die verfügbarenPlugins. Sie benötigen eine „virtuelle Soundkarte“, um den Ton an darkice usw. weiterzuleiten. Das ist ein Kernelmodul, also machen Sie so etwas wie
sudo modprobe snd-aloop pcm_substreams=2
zum Testen, und legen Sie eine Datei ein, /etc/modprobe.d
wenn es funktioniert. Angenommen, der Loopback ist hw:3,*,*
.
Auf der Eingangsseite der virtuellen Soundkarte benötigen Sie etwas wie
dmix "main_in" --> Stecker (Slave.Kanäle = 1) --> hw:3,0,0
Dann können Sie aplay -D main_in sound.wav
, und laufen
alsaloop -C hw:0 -P main_in
um es mit dem Audio-Grabber zu verbinden.
Auf der Ausgangsseite der virtuellen Soundkarte etwas wie
hw:3,1,0 --> dsnoop "Hauptausgang"
und um es wieder über den lokalen Audioausgang abzuhören,
alsaloop -C main_out -P local_audio_out
Anschließend kannst du auch darkice
direkt das VU-Meter laufen lassen main_out
. Übrigens arecord -D main_out -d 0 -vv /dev/null
ist das ein nettes VU-Meter zum Testen.
Lesen Sie die Details zur Syntax im obigen Link nach. Ich werde das nicht ausprobieren. Die -->
Pfeile zeigen die Master/Slave-Beziehungen des Plugins an. Die Latenz wird wahrscheinlich furchtbar sein, mit einem Loopback durch den Kernel-Speicher und vielen Userspace-Anwendungen.
Wenn Pulseaudio bei Ihnen nicht funktioniert, ist eine Alternative jack
, aber ich habe keine Erfahrung mit der Konfiguration.