Diffuser une source vidéo sur le net

En théorie, la diffusion de vidéo sur internet est simple, pour un fichier, les serveurs du genre de youtube, dailymotion et autres sont simples d’accès avec une interface convivial, on peut aussi mettre directement à disposition le fichier vidéo en question, et même utiliser des applications telle que itheora; par contre pour du direct, ça se corse…

Donc le but est de diffuser en direct une vidéo provenant d’un périphérique de capture, déjà, rien que pour le lire (en parlant de « cli »), c’est le bazar entre les paramètres des différents programmes, alors autant me faire un petit récapitulatif (et puis ça pourra toujours servir à d’autres):

# En supposant que le périphérique est reconnu sous /dev/video0
mplayer tv://
cvlc v4l2://
# Pour FFmpeg, il faut obligatoirement spécifier la taille (sinon, il me jette)
ffplay -f video4linux2 -s 320x240 /dev/video0

Bon, ceci dit,maintenant, faut diffuser, et alors là, je dois avoir quelque chose qui manque, car une commande qui fonctionne en local, ne fonctionne pas en réseau, des messages d’erreurs qui ne me parlent pas du tout, enfin tout et n’importe quoi, je pense qu’il faut faire des années d’études pour saisir.

Enfin bref, j’ai essayé plusieurs méthodes, deux ont fonctionné dont une seulement en local (source et serveur de diffusion sur la même machine):
FFmpeg (en local) (version 0.5)
VLC (version 1.0.0)

ffmpeg + ffserver

Sur la documentation, rien de bien compliqué:

# Pour afficher le flux:
ffplay -f video4linux2 -s 320x240 /dev/video0
# Pour par exemple l'encoder en theora:
ffmpeg -s 320x240 -f video4linux2 -i /dev/video0 -f ogg -vcodec libtheora -y video.ogv

Pour diffuser, on utilise ffserver qu’il faut auparavant configurer, créons un fichier ffserver.conf:

Port 8090
BindAddress 0.0.0.0
MaxClients 10
 
# Cette option est par défaut à 1000kb mais génère une erreur si la source dépasse:
# "http://localhost:8090/feed1.ffm: Unknown format"
# message très explicite ...
MaxBandwidth 50000
# On affiche tout sur la sortie standard
CustomLog -
 
# Pour l'instant, on teste
NoDaemon
 
# On a besoin d'une seule source

File /tmp/feed1.ffm
ACL allow 127.0.0.1

 
# On va le diffuser en flv 

Feed feed1.ffm
VideoBitRate 5200
VideoBufferSize 32
Format swf
VideoSize 320x240
VideoFrameRate 25
VideoQMin  3
VideoQMax  3
# Le NoAudio aussi cause une erreur très explicite s'il est omis et que la source n'a pas de son:
# "Could not find input stream matching output stream #0.0"
# ...
NoAudio

 
# Ce qui suit permet de suivre les infos du serveur de streaming

Format status
ACL allow localhost

Une fois le serveur configuré, on le lance ainsi:

ffserver -f ffserver.conf

Ensuite, il nous faut indiquer la source à diffuser:

ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 http://localhost:8090/feed1.ffm

Et normalement, c’est fini, il suffit de faire pointer un navigateur vers http://localhost:8090/notre_video.flv

(Pour la diffusion en theora ->bug 654)

Tout ça, c’est bien, mais malheureusement, il m’a été impossible d’envoyer un flux sur un serveur ffserv sur internet…

VLC

Avec vlc, c’est une autre paire de manches, la difficulté n’est pas tant de comprendre les messages d’erreurs mais de saisir la logique des options, à ce sujet, j’ai personnellement trouvé le wiki sur Nantes-Wireless très instructif même si certaines commandes n’ont pas voulu fonctionner (en tout cas chez moi).

Premier test:

cvlc -vvv v4l2:///dev/video:norm=pal:size=320x240 --sout '#transcode{vcodec=theora,vb=300}:std{access=http,mux=ogg,dst=:8080}'

Ça diffuse, ça diffuse pas, on essaie (sur un autre terminal):

cvlc http://localhost:8080

Test concluant. (en theora en plus, même si ça va pas durer :/)

Si vous avez un débit important en upload ou n’avez que votre machine, il suffit d’ouvrir les bons ports au niveau de votre routeur et c’est fini.

Par contre, si votre débit laisse à désirer et que vous avez accès à un serveur (dédié ou autre), le mieux serait de diffuser vers se serveur puis de s’en servir comme relais:

# Depuis votre ordinateur:
cvlc  v4l2:///dev/video:norm=pal:size=320x240 --sout '#transcode{vcodec=DIV3,vb=300}:standard{mux=ts,access=udp,dst=url_serveur:1234}' --no-audio
# Depuis le serveur sur le net
cvlc udp:// --sout '#standard{access=http,mux=ogg,dst=:8080}'
# ou s'il faut indiquer au navigateur le type de flux:
cvlc udp:// --sout '#standard{access=http{application/ogg},mux=ogg,dst=:8080}'
# Et pour voir la vidéo
cvlc http://url_serveur:8080

Quelques précisions, udp me paraît plus approprié vu le débit montant minable que nous offrent les opérateurs, le seul multiplexeur valide avec udp est le ts pour sa correction d’erreurs, et ce dernier refuse d’accepter du theora, par contre, n’ayant pas trouvé de ticket en parlant, c’est peut être une erreur de ma part.


Site FFmpeg, VLC

Commentaire (1)