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

comments powered by Disqus