Comment diffuser de l'audio à l'aide de FFMPEG?

3

En me basant sur la réponse de @ Allan , j'essaie de rediriger la sortie de ffmpeg vers un serveur.

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

Mais je reçois le message d'erreur suivant:

"Au moins un fichier de sortie doit être spécifié"

J'ai aussi essayé d'utiliser ffserver au lieu de SSH mais je n'ai aucune chance.

Est-il possible de diffuser de l' audio de cette façon?

utilisateur290246
la source
1
Apparemment, voir duckduckgo.com/?q=streaming+ffmpeg+over+ssh
nohillside

Réponses:

2

Je peux visualiser deux solutions pour ce scénario:

  • Enregistrement du fichier sur un ordinateur distant
  • Diffuser un flux en direct afin qu'un ordinateur distant puisse recevoir l'audio

Sauvegarder le fichier

C'est probablement la méthode la plus simple. Laissez le flux terminer l’enregistrement, puis copiez-le dans un emplacement prédéterminé du réseau. Ce script devrait correspondre à la facture:

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

exit 0

Le script ne vérifie aucune erreur, mais il enregistre à partir du microphone, puis, une fois terminé, il le copie via SCP (copie sécurisée) sur un ordinateur distant. Pour que cela fonctionne, vous devez configurer des clés SSH afin de faciliter une connexion non interactive .

Stream en temps réel

L'autre méthode consiste à diffuser l'audio via TCP via une connexion point à point. En utilisant la même entrée de la réponse précédente, nous modifions simplement la sortie en un flux réseau:

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

Où....

  • -fest le format de transport; dans ce cas, mpegts (flux de transport MPEG)
  • tcp://remote_host_or_IP_:port est la valeur URI du nom d'hôte / adresse IP et du numéro de port de l'ordinateur distant sur lequel il va écouter.

Configurer l'ordinateur distant pour "écouter"

L'utilisation de ffplayl'ordinateur distant peut être configurée pour recevoir le flux (j'ai utilisé Windows 10 pour cette partie, mais fonctionnera sous macOS / Windows / BSD / Linux)

Émettre la commande

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

Où....

  • -i définit le flux d'entrée
  • local_host_or_IP_addr:portest l'adresse IP ou le nom d'hôte et le port TCP de l' ordinateur en écoute (et non de l'ordinateur en streaming).
  • ?listen est nécessaire pour le mettre en "mode écoute" sinon il expirera si le flux n’y est pas.

Ci-dessous, un exemple réalisé sous Windows 10 recevant le flux du microphone d'un hôte macOS. L'adresse IP de l'ordinateur Windows 10 est 10.0.0.123 et je diffuse sur le 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

Une fois qu'il commence à recevoir la diffusion, les valeurs ci-dessus vont changer et une fenêtre de "visualisation" du lecteur s'ouvrira.

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

Il continuera à "écouter" jusqu'à ce que le processus soit tué.

Allan
la source