Multidiffuser un flux audio en UDP ou RTP
L'exercice est de diffuser sur un réseau ip un flux audio non compressé, via les protocoles udp
et rtp
. Nous générerons une forme d'onde sinusoïdale avec ffmpeg
comme source audio et la multidiffuserons à l'adresse du groupe multicast suivant: 239.0.0.1
, sur le port 1234
.
Une sinusoïde à 440Hz
Cette commande va afficher sur la sortie standard un flux pcm non compressé, stéréo, 16 bits, 48kHz, en petit boutiste :
1ffmpeg -re -f lavfi -i "sine=frequency=440:sample_rate=48000" -ac 2 -f s16le -
En UDP
On injecte via un tube ce signal sinusoïdal dans le processus de diffusion udp
:
1ffmpeg -re -f lavfi -i "sine=frequency=440:sample_rate=48000" -ac 2 -f s16le - | ffmpeg -f s16le -ar 48000 -ac 2 -i - -f s16le udp://239.0.0.1:1234
Pour lire ce flux :
1ffplay udp://239.0.0.1:1234 -f s16le -ar 48k -ac 2
Pour enregistrer le flux dans un fichier (conteneur wav):
1ffmpeg -f s16le -ar 48k -ac 2 -i udp://239.0.0.1:1234 test.wav
en RTP
On injecte maintenant le signal sinusoïdal dans le processus de diffusion rtp
:
À noter que le protocole rtp
est plus exigeant sur le contenu. On doit avoir un flux qui suit une orientation "gros-boutiste", d'où le -f s16be
1ffmpeg -re -f lavfi -i "sine=frequency=440:sample_rate=48000" -ac 2 -f s16be - | ffmpeg -f s16be -ar 48000 -ac 2 -i - -c:a copy -f rtp rtp://239.0.0.1:1234
Le contenu du fichier de description SDP nécessaire pour la lecture est affiché dans la console de ffmpeg
. Enregistrons le sous flux.sdp
.
1v=0
2o=- 0 0 IN IP4 127.0.0.1
3s=No Name
4c=IN IP4 239.0.0.1
5t=0 0
6a=tool:libavformat LIBAVFORMAT_VERSION
7m=audio 1234 RTP/AVP 97
8b=AS:1536
9a=rtpmap:97 L16/48000/2
Lecture :
1ffplay -protocol_whitelist file,udp,rtp flux.sdp
Enregistrement du flux rtp
dans un fichier :
1ffmpeg -protocol_whitelist file,udp,rtp -i flux.sdp flux.wav
Note: Le flux sera transcodé de big endian
à litte endian
pour rentrer dans un conteneur wav
1 Stream #0:0 -> #0:0 (pcm_s16be (native) -> pcm_s16le (native))
Si l'on ne veut faire aucun transcodage, on peut aussi utiliser un conteneur aiff
qui stocke le flux directement au format big endian
.
1ffmpeg -protocol_whitelist file,udp,rtp -i flux.sdp flux.aiff
1 Stream #0:0 -> #0:0 (pcm_s16be (native) -> pcm_s16be (native))
À noter que le transocdage big-endian <-> little-endian ne dégrade pas le signal, il y a juste une inversion dans le stockage entre les octets de poids fort et les octets de poids faible.
Ressources
- https://fr.wikipedia.org/wiki/Multicast
- https://fr.wikipedia.org/wiki/Boutisme
- https://github.com/aerogus/dvbstream/
- https://aerogus.net/posts/streamer-flux-audio-pcm/
- https://fr.wikipedia.org/wiki/Audio_Interchange_File_Format
- https://fr.wikipedia.org/wiki/Waveform_Audio_File_Format
- https://en.wikipedia.org/wiki/Real-time_Transport_Protocol