Wie streame ich Audio mit FFMPEG?

Aufbauend auf der Antwort von @ Allan versuche ich, die ffmpeg-Ausgabe auf einen Server umzuleiten.

$ ffmpeg -f avfoundation -i ":1" -t 10 - | ssh user@host .... -

Aber ich bekomme folgende Fehlermeldung:

"Mindestens eine Ausgabedatei muss angegeben werden"

Ich habe auch versucht, ffserver anstelle von SSH zu verwenden, aber ich habe kein Glück.

Ist es möglich, Audio auf diese Weise zu streamen ?

Anscheinend ist es das, siehe duckduckgo.com/?q=streaming+ffmpeg+over+ssh

Antworten (1)

Es gibt zwei Lösungen, die ich mir für dieses Szenario vorstellen kann:

  • Speichern der Datei auf einem Remote-Computer
  • Einen Live-Stream senden, damit ein entfernter Computer das Audio empfangen kann

Speichern der Datei

Dies ist wahrscheinlich die einfachste Methode. Warten Sie, bis der Stream die Aufzeichnung beendet hat, und kopieren Sie ihn dann an einen vorbestimmten Ort im Netzwerk. Dieses Skript sollte die Rechnung erfüllen:

#!/bin/bash
#
ffmpeg -f avfoundation -i ":1" -t 10 audiocapture.mp3
scp audiocapture.mp3 user@host:/foo/bar/audiocapture.mp3

exit 0

Das Skript führt keinerlei Fehlerprüfung durch, nimmt jedoch vom Mikrofon auf und kopiert es nach Abschluss über SCP (sichere Kopie) auf einen Remote-Computer. Damit dies funktioniert, müssen Sie SSH-Schlüssel einrichten, um eine nicht interaktive Anmeldung zu ermöglichen .

Streamen Sie in Echtzeit

Die andere Methode besteht darin, das Audio über TCP über eine Punkt-zu-Punkt-Verbindung zu übertragen. Mit der gleichen Eingabe aus der vorherigen Antwort ändern wir einfach die Ausgabe in einen Netzwerkstream:

$ ffmpeg -f avfoundation -i ":1" -t 10 -f mpegts "tcp://remote_host_or_IP_:port"

Wo....

  • -fist das Transportformat; in diesem Fall MPEGTs (MPEG Transport Stream)
  • tcp://remote_host_or_IP_:portist der URI-Wert des Hostnamens/der IP-Adresse und der Portnummer des entfernten Computers, auf dem er lauschen wird.

Stellen Sie den Remote-Computer auf „lauschen“

Die Verwendung ffplaydes Remote-Computers kann so eingestellt werden, dass er den Stream empfängt (ich habe Windows 10 für diesen Teil verwendet, funktioniert aber unter macOS/Windows/BSD/Linux).

Geben Sie den Befehl aus

ffplay -i tcp://local_host_or_IP_addr:port?listen -hide_banner

Wo....

  • -idefiniert den Eingabestrom
  • local_host_or_IP_addr:portist die IP-Adresse oder der Hostname und der TCP-Port des lauschenden Computers (nicht des streamenden Computers).
  • ?listenist erforderlich, um es in den "Zuhörmodus" zu versetzen, da es sonst zu einer Zeitüberschreitung kommt, wenn der Stream nicht vorhanden ist.

Unten sehen Sie ein Beispiel in Windows 10, das den Stream vom Mikrofon eines macOS-Hosts empfängt. Die IP-Adresse des Windows 10-Computers ist 10.0.0.123 und ich sende auf Port 1234.

C:\Users\allan\Desktop\ffmpeg>ffplay -i tcp://10.0.0.123:1234?listen -hide_banner

    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

Sobald es beginnt, die Sendung zu empfangen, ändern sich die obigen Werte und ein Player-"Visualisierungs"-Fenster öffnet sich.

Input #0, mpegts, from 'tcp://10.0.0.123:1234?listen':B f=0/0
384 kb/s    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
  Program 1   0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
    Metadata: 0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
Service01    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0       0B f=0/0
FFmpeg    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0   sq=    0B f=0/0
    Stream #0:0[0x100]: Audio: mp2 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, fltp, 384 kb/s
  11.35 M-A:  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

Es wird weiterhin "zuhören", bis der Prozess beendet wird.