Comment diffuser des vidéos en direct depuis un serveur Linux?

30

Voici ce que je veux faire. J'ai regardé autour de moi mais je n'ai trouvé aucune réponse directe. J'ai une boîte Linux exécutant des sites Web utilisant Ubuntu / MySQL / Apache. J'ai également ma propre adresse IP statique, c'est-à-dire que je n'utilise pas d'hébergement Web. J'aimerais pouvoir diffuser le flux vidéo d'une webcam sur un ordinateur portable (exécutant probablement Windows) sur mon serveur Linux, et que les utilisateurs de l'un de mes sites Web puissent voir cette vidéo en direct pendant qu'elle est diffusée. De toute évidence, l'ordinateur portable devrait s'authentifier auprès du serveur d'une manière ou d'une autre, mais il ne devrait y avoir aucune restriction quant à qui pourrait voir la vidéo en direct sur le site Web. Merci.


la source
demandez-vous comment implémenter une telle solution ou recherchez-vous une solution tierce prête à l'emploi? dans l'ancien cas, SO n'est pas le bon endroit pour cette question, je pense que c'est la raison du vote négatif

Réponses:

46

Je développe actuellement le streaming en ligne à partir de 3 caméras miniDV connectées via FireWire, ce qui est assez similaire à vos besoins.

Petit conseil: vlc + flowplayer / jw player

Tout d'abord, il existe deux formats vidéo que vous pouvez utiliser en streaming en ligne: FLV et h264. FLV est plus facile à transcoder, le h264 a un meilleur rapport taille / qualité mais le transcodage consomme beaucoup plus de processeurs. Les deux peuvent être affichés par des lecteurs flash dans la page Web.

Deuxièmement, l'infrastructure de streaming. Étant donné que la bande passante de votre ordinateur portable est limitée (quelques Mbps), vous devez obtenir le flux sur votre serveur et le retransmettre aux clients. Ainsi, le flux coulera 1 fois vers le serveur, puis N fois vers les clients à partir de là. Vous n'avez pas décrit votre connexion Internet pour votre ordinateur portable, le scénario est donc divisé en deux sections:

  1. L'ordinateur portable est connecté avec une adresse IP publique OU vous pouvez connecter le port NAT à l'ordinateur portable . Ce scénario est beaucoup plus facile, car vous pouvez vous connecter facilement du serveur au portable. Le gros inconvénient est que vous êtes lié à un emplacement (une adresse IP).

  2. Ordinateur portable n'est pas connecté avec l' adresse publique I . C'est un peu délicat, mais cela fonctionnera à partir de n'importe quel réseau qui vous permettra de SSH sur votre serveur et d'avoir un téléchargement suffisant (1 Mbps devrait le faire).

Quel que soit le scénario utilisé, l’infrastructure ressemblera à ceci

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

Streaming depuis un ordinateur portable

  1. Capture vidéo de webcam . Je n'ai jamais capturé de flux à partir d'une webcam connectée localement, mais il existe de nombreux exemples pour le faire via V4L, par exemple: Configuration de la webcam . La seule partie qui devrait vous intéresser est:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    Quelle est la première partie de la commande VLC pour se connecter à la webcam. Pour plus de détails, suivez le HOWTO mentionné. Regardez en particulier la partie "groupe vidéo" et corrigez le chemin du périphérique vers / dev / video et / dev / audio. Ceux-ci peuvent être différents sur votre ordinateur portable.

  2. Transcoder la vidéo en FLV . J'utilise personnellement FLV, car il demande moins de CPU. La chaîne de transcodage que j'utilise est la suivante:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    Qui transcodera le flux vidéo au format FLV avec audio MPGA (le MP3 n'est pas disponible sur mon Ubuntu). Samplerate est en quelque sorte obligatoire, il ne fonctionnera pas sans lui. Mais vous pouvez choisir un format plus petit, comme 22050. Cela transcodera le flux vidéo «tel quel», donc l'échelle est de 1: 1. Vous pouvez ajouter des paramètres de largeur et de hauteur, ou même des paramètres d'échelle. Regardez dans la documentation VLC.

  3. Diffusez-le depuis un ordinateur portable . Maintenant, vous devez créer un flux local, sur lequel le serveur se connectera:

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    Cela liera le flux VLC à 0.0.0.0:8081/stream.flv. La commande entière ressemblera à ceci:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

Réexécution sur le serveur

  1. Capturez le flux sur le serveur et réenregistrez-le . Encore une fois, nous utilisons VLC pour capturer et diffuser. L'utilisation est basée sur le scénario d'infrastructure au début de ce post. Comme je l'ai montré, VLC sur un ordinateur portable diffuse de la vidéo sur un port. Ce port doit être accessible depuis le serveur. Si vous avez l'adresse IP publique d'un ordinateur portable ou un port NAT, vous pouvez le tester avec telnet:

    server$ telnet public_ip_address 8081

    Tout sauf le "délai d'expiration de la connexion" révélera que vous pouvez vous connecter au flux de votre ordinateur portable. Si vous n'avez pas d'adresse IP publique ou que vous ne pouvez pas utiliser le port NAT, vous devez le faire dans l'autre sens. Vous pouvez SSH de l'ordinateur portable au serveur et transférer à distance le port de votre ordinateur portable vers le serveur. La commande SSH correcte serait:

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    Cette commande magique «liera» le port 8081 de votre ordinateur portable au port 8081. Cela signifie que lorsque vous vous connectez sur le serveur au 8081, vous vous connectez silencieusement au port 8081 de votre ordinateur portable via le tunnel SSH. Cool, hein? :) Donc, tout ce que nous avons à faire est de se connecter et de diffuser VLC:

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Ou en cas d'adresse IP publique ou de port NAT:

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Comme dans la partie ordinateur portable, votre VLC sur le serveur est lié au port 8082. Pourquoi 8082 et non 8081? 8081 est déjà pris par le transfert distant SSH. Pourquoi nous n'utilisons pas la partie transcodée comme dans le premier exemple? La vidéo est déjà au bon format, donc tout ce que nous avons à faire est de la diffuser telle quelle.

  2. Test . Dans les deux exemples, vous pouvez tester la fonctionnalité en affichant les flux via VLC. Vous pouvez tester votre flux local:

    laptop$ vlc http://localhost:8081/stream.flv

    Et vous pouvez tester le flux de votre serveur:

    laptop$ vlc http://server_ip_address:8082/stream.flv

    Dans les deux cas, vous devriez voir l'entrée de votre webcam.

Afficher le flux sur le Web

L'affichage du flux sur le Web, qui fonctionnera dans la plupart des cas, se fait via Flash Player. J'ai essayé deux produits gratuits pour une utilisation non commerciale: JW Player et Flowplayer . Je suis resté avec Flowplayer, mais je ne me souviens pas de la raison, peut-être à cause des plugins (que je n'utilise pas :)) ou à cause d'une meilleure documentation.

Comment afficher le flux FLV de VLC dans la page Web est couvert ici: Stream VLC vers le site Web avec asf et Flash

Dépannage

Soyez conscient de nombreux problèmes qui surgiront. La première chose, comme dans tout, lisez . VLC est un programme très bavard, il vous indiquera donc où est le problème. Peut-être un problème avec les autorisations d'accès au périphérique vidéo / audio, les codecs manquants, les paramètres --sout mal orthographiés, ... Apprenez à utiliser iftoppour voir si les données circulent vraiment via le réseau, etc.

mkudlacek
la source
1
Merci beaucoup! C'était plus d'informations que ce à quoi je m'attendais. Va vérifier VLC et utiliser vos informations comme guide.
3

Mon outil de choix ici serait vlc . Ce n'est pas seulement un lecteur vidéo multiformat polyvalent, il est également capable de diffuser en continu dans une multitude de formats de fichiers et de protocoles de diffusion en continu. En prime, il fonctionne sur plusieurs plates-formes entre les hôtes Windows et Linux.

Nous avons créé quelque chose de similaire il y a quelques années où un client utilisant une ligne DSL à bande passante étroite (128 K en amont) devait diffuser ses webcams connectées au réseau à un large public. Une installation VLC en tant qu'hôte "réflecteur" a effectué la rotation du signal de came, a pris la charge de bande passante principale des clients de streaming et a présenté le flux dans différents protocoles et formats de streaming.

le-wabbit
la source
1

Pas vraiment mon domaine d'expertise, mais je peux peut-être vous indiquer une direction potentielle.

L'implémentation commerciale consiste à utiliser Flash Media Server d'Adobe. Bien sûr, cela peut être une approche assez coûteuse. Il existe cependant des alternatives open source - comme Red5 . Vous devrez installer le serveur (il a des dépendances Java).

Une fois que le serveur est en cours d'exécution, vous pouvez choisir votre frontal (je crois que Red5 est livré avec quelques exemples, mais vous pouvez également utiliser JW Player avec type=camera).

Le frontal recevra la vidéo en streaming du serveur multimédia et vous téléchargerez votre flux sur le serveur multimédia.

Informations complémentaires: Red5 Aide & Infos et Red5 Référence

cyberx86
la source
jwplayer est une chose géniale pour un usage personnel
Kendrick