Leiten Sie den ICECAST-Stream an ein Dummy-Gerät weiter

859
Ivan Kolesnikov

Ich möchte einen Icecast-Stream über FFmpeg an udp senden, aber wenn der Icecast-Stream fallen gelassen wird, fällt auch FFmpeg. Ich denke, wenn ich den Icecast-Stream als ein Dummy-Gerät routen könnte, dann könnte ich Daten über FFmpeg erhalten. Zum Beispiel:

ffmpeg -f alsa -i hw:Dummy,0 -f mpegts udp://ip:port 

Im Falle eines Abfalls des Icecast-Streams wird der Ausgangs-UDP-Stream lautlos wiedergegeben und spielt solange weiter, bis der Stream wieder verfügbar ist. (Dies ist meine Annahme).

Gibt es eine Möglichkeit, einen Icecast-Stream an ein Dummy-Gerät weiterzuleiten? Oder gibt es eine andere Variante für das Routing von Icecast Stream zu udp, um im Falle eines Icecast Stream-Dropout leise zu spielen, und dann automatisch zum normalen Spiel zurückkehren, wenn der Icecast Stream wieder verfügbar ist?

0
Sie haben diese Frage mit pulseaudio markiert. Muss es ein ALSA-Dummy-Gerät sein oder kann es auch eine Pulseaudio-Quelle sein? Viel einfacher zu installieren (obwohl ich nicht sicher bin, was das Start / Stopp-Verhalten angeht, müsste ich das herausfinden). dirkt vor 7 Jahren 0
@dirkt Danke für den Kommentar! Es ist ein ALSA-Dummy-Gerät. Ich habe die Frage mit pulseaudio getaggt, denn so wie ich verstanden habe, können wir pulseaudio verwenden, um einen Icecast-Stream an ein Dummy-ALSA-Gerät zu leiten. Aber ich kann mich irren.) Ich möchte auf jeden Fall ein virtuelles Soundgerät erstellen -> einen Icecast-Stream dorthin routen -> diesen Stream vom virtuellen Soundgerät über ffmpeg abrufen. Jede Lösung ist angemessen, ohne zwingende Bedingungen.) Ivan Kolesnikov vor 7 Jahren 0

2 Antworten auf die Frage

1
dirkt

Ich interpretiere Ihren Kommentar als "Verwendung von Pulseaudio ist ok". Ich habe das nicht getestet, aber ich würde Folgendes tun:

Erstellen Sie zunächst eine Pulseaudio-Nullsenke:

pacmd load-module module-null-sink sink_name=icecast sink_properties=device.description=Icecast 

In Pulseaudio ist jeder Senke eine .monitorQuelle zugeordnet, so dass Sie auf diese Weise den Ton an die icecastSenke ausgeben und in anderen Anwendungen mit der Sendeplatte verarbeiten könnenicecast.monitor Quelle verarbeiten können.

Wenn ich Sie richtig verstanden habe, möchten Sie den Icecast-Stream auf Ihrem Computer empfangen . Um den Stream an die icecastSenke auszugeben, machen Sie etwas

mplayer http://your.icecast.server -ao pulse::icecast 

Wenn der Icecast-Stream endet, mplayerwird er auch beendet, also in ein Shell-Skript in ein Unendliches packenwhile usw.

Ich bin mir nicht sicher, was ich mit dem Teil "Stream to udp via ffmpeg" verstehe. Auf jeden Fall können Sie jetzt lesen aus icecast.monitormit

ffmpeg -f alsa -i pulse ... 

bei Verwendung von pavucontroloder pamcdzur Auswahl der richtigen Quelle oder ffmpegdirekt beim Kompilieren mit pulseaudio-Unterstützung

ffmpeg -f pulse -i icecast.monitor ... 

Wenn jedoch die Idee "Ich möchte diesen Icecast-Stream auf andere Computer in meinem Heimnetzwerk verteilen" soll, ist es möglicherweise besser, ein Pulseaudio-RTP-Modul zu verwenden als Senke zu verwenden.

Wie gesagt, nichts davon wird getestet, Sie müssen möglicherweise Teile anpassen, damit es funktioniert.

Bearbeiten

Ich bin auch nicht sicher, ob ein ALSA-Dummy-Gerät überhaupt funktionieren würde. Nach meinem Verständnis sind sie wirklich nur "Dummy" -Geräte und bieten keinen Loopback. Sie müssten dafür das snd-aloopLoopback-Gerät verwenden, und dieses ist ein bisschen schmerzhaft, da Sie ständig Probleme mit der Abtastrate haben.

Sie können also die Pulseaudio-Infrastruktur besser nutzen.

Danke vielmals! Ich habe nachgesehen und es funktioniert super! Lautlos, wenn der Icecast-Stream ausgefallen ist und beim nächsten Betrieb fehlerfrei abgespielt wird! UDP-Ausgabe ist stabil! Ivan Kolesnikov vor 7 Jahren 0
1
Aaron Muir Hamilton

Sie können das Loopback-Gerät anstelle des Dummy-Geräts verwenden.

Das Loopback-Gerät ist standardmäßig nicht aktiviert. Sie müssen daher zunächst das Kernelmodul snd-aloop mit Argumenten laden, um den gewünschten Typ und die Anzahl der Teilströme anzugeben:

# modprobe snd-aloop index=0 pcm_substreams=1 

Anstatt Icecast zu routen, hw:Dummy,0können Sie ihn dann an hw:Loopback,0,0ffmpeg weiterleiten und aus diesem lesen hw:Loopback,1,0.

Danke für die Antwort! Kannst du mir bitte erklären, wie ein Icecast-Stream an ein Loopback-Gerät geleitet wird? Ivan Kolesnikov vor 7 Jahren 0
@IvanKolesnikov Das sollte mit jedem Player möglich sein, der von IceCast streamen kann, solange Sie auf dem Gerät spielen. Hw: Loopback, 0,0 Zum Beispiel würden Sie mit MPV `mpv --audio-device = alsa / hw: Loopback, 0,0 http: // example.com / pfad / to / icecast / stream` oder mit SoX würden Sie `sox http://example.com/path/to/icecast/stream -t alsa hw: Loopback 1,0 '. Aaron Muir Hamilton vor 7 Jahren 1