streamer en RTMP avec ffmpeg

Il y a pas longtemps, j’ai découvert qu’on pouvait se servir de ffmpeg comme encodeur Flash, pour pousser en utilisant le protocole propriétaire d’Adobe (le RTMP). J’ai testé ça avec un serveur Wowza comme cible (c’est pratique dès fois de bosser dans une boîte qui fait du streaming).

Ça se passe donc comme ça:

ffmpeg -i $src <mes options> -f flv rtmp://mon_serveur_flash/mon_appli_flash/mon_flux
  • <mes options> : c’est détaillé  ;
  • -f flv : on prend un container Flash Video pour pousser du Flash (c’est plutôt logique :-)) ;
  • la destination: au lieu d’un fichier ou d’une spec de flux rtp (par exemple), on spécifie une URL en rtmp:// avec les infos qui sont normalement fournies par votre fournisseur (en général: un hostname, un nom d’«application» – c’est la partie du serveur Flash qui est dédiée à un client –), et un nom de flux que l’on choisit comme on veut (en respectant la règle habituelle: pas d’accents, pas d’espaces, pas de caractères bizarroïdes).

Si on a la bande passante pour, et que l’on veut pousser sur plusieurs serveur, on peut multiplier les <mes options> et les URLs de destinations:

ffmpeg -i $src <mes options> -f flv rtmp://serveur1/mon_appli/mon_flux <mes options> -f flv rtmp://serveur2/mon_appli/mon_flux [...]

On peut aussi pousser sur un ou plusieurs serveurs plusieurs versions du flux $src (pour avoir plusieurs débits quand on veut faire Apple HTTP Live Streaming ou du Adobe HTTP Dynamic Streaming). On peut s’aider de la cochonnerie que j’ai publiée sur commandelinefu pour un flux RTP 🙂

streamer du h264/aac en RTP avec ffmpeg

La version simple:

ffmpeg [source specification if needed] -i $src -an $mes_options_vidéo -f rtp rtp://$dstIP:$dstVideoPort -vn $mes_options_audio(aac) -async 2 -flags +global_header  -f rtp rtp://$dstIP:$dstAudioPort

Pour $mes_options* voir ici

$src peut-être n’importe quelle source reconnue par ffmpeg (un fichier, un flux audio/vidéo repompé quelque part)…

$dstIP est l’IP du client RTP qui aura besoin de savoir sur quels ports UDP il devra écouter pour la composante audio ($dstAudioPort) et pour la composante vidéo ($dstVideoPort).

Dans la sortie de ffmpeg, on trouvera aussi le nécessaire pour faire un beau fichier sdp.

J’avais publié une version crade de ce truc sur commandlinefu.