web-dev-qa-db-fra.com

Serveur multimédia NodeJS et RED 5 via RTMP

Il s’agit plus d’une question conceptuelle que d’un simple "comment faire". 

Est-il généralement possible d'implémenter une solution de type flash pour diffuser l'audio (indépendamment de l'endroit d'où proviennent les données de flux, par exemple webRTC ou autre) en HTML5 et nodeJS/binaryJS. Si oui, comment vous y prendriez-vous?

Il n'y a eu qu'une seule enquête sur stackoverflow trouvé ici et depuis 2010. NodeJS et HTML5 ont grandi et mûri depuis.

Ce que les gens font habituellement: Lors de l'utilisation de la diffusion multimédia (c'est-à-dire vidéo ou audio) sur un serveur, il n'y a absolument rien qui bat Flash au moment actuel jusqu'à l'arrivée complète de getUserMedia () _ - ce qui pourrait très honnêtement prendre un peu de temps } jusqu’à 99% des utilisateurs du navigateur pourront l’utiliser.

Pour diffuser des données sur le serveur, il est courant d’utiliser une application cliente Flash ou Flex qui se connecte ensuite à un serveur multimédia alimenté par le protocole RTMP, tel que RED5 , FMS ou Wowza . Par exemple, l'application cliente qui envoie l'entrée du microphone via RTMP pourrait ressembler à (version simplifiée)

import flash.net.NetStream;

private var myMic:Microphone;
private var nc:NetConnection;
private var ns:NetStream

nc = new NetConnection();    
ns = new NetStream(nc);
nc.connect(rtmp://localhost/serverApp);
myMic = Microphone.getMicrophone();
ns.attachAudio(myMic);

Avec une application serveur, il est facile de transférer des données sur le serveur.

Ce que je voudrais faire: Avoir un serveur d'applications qui s'exécute sur nodeJS (implémentant éventuellement socketIO et binaryJS ) qui intercepte le trafic entrant Flux RTMP. Quelque chose comme

//require
var rtmp = require('node-rtmp'),
var fs = require('fs');

//rtmp server address
var rtmpServer = 'rtmp://localhost';

//create a binary server listening that receives stream data
var RTMPServer = rtmp.RTMPServer();
var server = RTMPServer ({port: 1935});

server.on('connection', function(client){
 //check if user is allowed to do so
 rtmp.newStream(client.stream);
});

Peut-être serait-il préférable d'utiliser socketIO pour différencier les interactions des utilisateurs via eventEmitters.

Quels pourraient être les avantages: De manière générale, une telle approche semble être un peu fastidieuse, mais pour moi, il pourrait y avoir des avantages et j'aimerais également que vous commentiez ceci.

  • validation facile de l’interaction de l’utilisateur en exécutant, par exemple, express et socketIO
  • implémentation hybride d'un flash (via RTMP) et de getUserMedia () (via des mécanismes de transport binaires en ajoutant binaryJS et MozAP AudioAPI)
  • si getUserMedia () est complètement supporté, les implémentations flash peuvent être abandonnées facilement
  • plus de contrôle sur le suivi rtmp et l'interaction utilisateur en général
  • mise en œuvre plus facile dans les infrastructures de serveur

UPDATE: J'ai parlé à M. Malcontenti-Wilson, responsable du seul paquetage node-rtmp qui a été écrit mais a été arrêté il y a 8 mois car il était mal écrit et il frapper un barrage routier. Quiconque a utilisé ceci ou a pu vérifier le code?

UPDATE 2: M. Malcontenti-Wilson vient de m'envoyer un mail pour attirer mon attention sur (node-mtrude } (nom étrange) qui fait ce que nous voudrions probablement. Quelqu'un at-il travailler avec ce genre de forfait?

58
toxicate20

Oui c'est possible, mais vous avez quelques problèmes.

1) Red5 est terriblement sous-documenté et buggy.

2) rtmpe/rtmps

3) performance/évolutivité

4) 1 à 3 sont des choses que vous pouvez surmonter, mais pas sans apprendre à connaître la distribution des médias et tous les problèmes qui y sont associés très intimement. Lorsque vous aurez terminé, vous serez parmi quelque 800 personnes qui le comprendront vraiment. Vous devrez parcourir un long chemin pour résoudre des problèmes inattendus.

2
Steve Kallestad

Il existe maintenant une plate-forme appelée vertx disponible où le développement polygot est possible. Ainsi, red5 jar peut être inclus côté serveur avec le code existant et peut exécuter un serveur de diffusion en continu rtmp. Du côté du client, vous pouvez avoir quelque chose comme video.js ou JW player pour lire le flux et disposer de la politique de retour en arrière. La publication côté client, je ne sais pas s'il existe ou non une implémentation RTMP basée sur JavaScript. 

1
Vivek

WCS est une implémentation hybride pour les protocoles compatibles Flash, WebRTC, SIP, Websockets et Wowza: RTSP, RTMP.

Schéma de conversion de flux:  enter image description here

1
John Doe

c’est une vieille question, mais j’écris cette alternative pour les gens qui vont tomber sur ça .Le serveur de médias à nœuds est un bon serveur de médias, je l’ai utilisé dans un de mes supports, rtmp https://www.npmjs.com/package/node-media-server

son repo git est également assez vivant, En fait, j'ai fait quelques changements avant de l'utiliser dans mon poc. Et le code est également bien écrit. https://github.com/illuspas/Node-Media-Server

PS. cela fonctionne comme un charme avec OBS pour la diffusion en direct.

0
ashish shiwalkar