Chat vidéo WebRTC avec Ajax au lieu de WebSocket: Possible?
Il y a six mois, j'ai pu réussir le code de mon propre serveur WebSocket script en PHP. Grâce à cela, j'ai été capable de mettre en place un WebRTC service de vidéo chat sur mon hôte local. J'ai été très heureux jusqu'à ce que j'ai réalisé que, pour le déployer, j'avais besoin d'un serveur web qui m'a donné accès aux sockets.
Malheureusement, aucun d'hébergement web partagé permet à pour les prises et tous les serveurs web qui offrent des sockets sont chers. Alors que pas une solution efficace sur une grande échelle, pour l'amour de la création d'une démo pour montrer aux gens, je veux changer la méthode de signalisation de WebSocket à Ajax afin que je puisse montrer WebRTC service de vidéo chat que j'ai fait.
À cette fin, j'ai essayé de coder quelque chose depuis quelques jours, mais n'ont pas eu de succès en obtenant le WebRTC pairs pour capturer des uns et des autres vidéo.
À l'instant, quand un client se connecte sur le script, j'utilise de l'Ajax pour envoyer une demande à un script PHP qui vérifie si il y a d'autres utilisateurs actifs dans la DB. Si non, le script crée ensuite une offre, et des lieux de l'offre de la DB. Après cela, le client interroge un distinct script PHP à chaque seconde pour vérifier une réponse à partir d'un autre client qui se connecte au script.
Après cela, je puis vous connecter à l'script à partir d'un autre client, qui interroge le même script PHP et de la DB, qui se rend alors compte qu'un utilisateur actif (de la première connexion) a déjà publié une offre, le deuxième, le client acquiert et des décors pour la télécommande description. Le deuxième client crée ensuite une réponse, qui est placé dans la DB.
À ce point, le premier client (qui est d'interrogation de la DB à chaque seconde) détecte que la réponse est présente et que des ensembles de réponse à distance description pour le premier client. Malheureusement, même après avoir réussi à faire tout ça, de l'autre client de la vidéo n'est pas à éclater.
Donc voilà où j'en suis confus et trois (multipart) questions:
1), j'ai pensé que, après tant de clients à définir leurs locaux description, puis envoyé locaux de la description à l'autre client et l'autre client qui a reçu la description de la télécommande description de l'onaddstream événement était censé le feu, me permettant ainsi de l'affichage de la vidéo à distance. Cependant, ce n'est pas le cas. Ça marchait bien avant, quand j'ai utilisé WebSocket, mais cela ne fonctionne pas du tout avec Ajax pures. Est-il quelque chose en particulier, je suis absent? A WebRTC spec changé radicalement au cours des six derniers mois? J'ai essayé de regarder le WebRTC specs, mais je ne vois pas de changements majeurs.
2) Après frustré de ne pas arriver à des choses à travailler avec l'Ajax, je suis retourné à mon WebSocket version et l'a chargé sur mon hôte local. Je n'ai pas changé le code à tous, depuis la dernière utilisation (ce qui a bien fonctionné il y a six mois), mais maintenant, quand j'essaie de l'utiliser, parfois ça marche et parfois ça ne marche pas. Parfois, j'ai des erreurs liées à l'impossibilité de définir le local et/ou distant descriptions. Qu'est-ce cela? Il y a eu des changements aux spécifications qui serait l'origine de ce problème? À cet égard, même si je ne peux pas obtenir de la télécommande vidéos de pop-up avec l'Ajax version, j'ai été en écho à beaucoup de choses à la console, et il semble comme avec l'Ajax version ainsi, parfois, le local et à distance des descriptions pour les deux clients sont correctement mis en place, et parfois, les erreurs se produit lorsque vous tentez de définir la locale/à distance des descriptions pour quelque raison que ce soit, même si je suis en cours d'exécution exactement le même script à chaque fois sans aucun changement. J'utilise la dernière version de Chrome, et je commence à me demander si il y a un bug ou quelque chose.
3) Est le onicecandidate gestionnaire d'événements nécessaires pour établir une connexion? Mon hypothèse était que les pairs pourrait établir une connexion avec simplement une offre valide et la réponse, et que le onicecandidate événement a été utiliser pour fournir d'autres routes, etc., ce qui pourrait conduire à une meilleure qualité de connexion (mais ne sont pas obligatoires). Suis-je tort? Si le onicecandidate info est nécessaire, comment me recommandez-vous gérer cela avec Ajax comme la signalisation méthode?
Je sais que beaucoup d'informations et beaucoup de questions, mais toutes les informations/connaissances que n'importe qui peut offrir serait très apprécié. J'ai été frapper ma tête contre mon bureau depuis quelques jours à essayer de comprendre cela, et rien n'est de donner un sens.
source d'informationauteur HartleySan
Vous devez vous connecter pour publier un commentaire.
Mon premier conseil au sujet de votre application. de travail/pas de travail, de façon sporadique, c'est de regarder en ligne en cours de travail mises en œuvre. Il y a beaucoup de WebRTC démos sur les Internets.
AJAX
Sur AJAX: pourquoi ne serait-il pas de travail? Je suis actuellement en train de travailler sur la même chose que vous, et il fonctionne très bien chaque fois que (je ne peut pas divulguer la source pour le moment). Les Clients sont en constante interrogation du serveur à intervalles réguliers et qu'ils peuvent envoyer SDP descriptions/GLACE candidats à un autre client de cette façon. Le serveur agit comme un simple pont (c'est la base de la signalisation).
Être il WebSocket, AJAX ou IPoACaussi longtemps que vous le transfert à l'autre client tout ce qu'il faut (et au bon moment, plus sur cela plus tard), cela devrait fonctionner. J'ai même fait une démonstration où vous manuellement copier/coller la description SDP et de la GLACE candidats à l'aide de zones de texte et cliquez sur les boutons pour aller de l'avant dans le processus de signalisation et que, bien sûr, a bien fonctionné aussi.
GLACE candidats
Maintenant: oui, vous avez besoin de la GLACE de candidats. Regardez un exemple de SDP offre morceau je viens générées à l'aide de
createOffer
sur Chrome 27:Ne vous voyez quelque chose qui pourrait aider un autre client de se connecter à ma machine? Je ne le pense pas. Le but de toute cette GLACE mécanisme est de rassembler connexion candidats (local, comme
192.168.1.15
"public" (l'adresse IP publique attribuée par votre FAI) à l'aide d'ÉTOURDISSEMENT si vous êtes derrière un NAT qui n'est pas symétrique, ou de VIRAGE de la symétrie des NATs).Lors de la réception de celles de la GLACE candidats, l'autre par les pairs va les commander à l'aide de certaines des mesures prédéfinies pour établir les priorités et puis le problème des tests de connexion de trouver un bon candidat. Merci donc de partager entre eux: les autres par les pairs a besoin d'eux (et vous avez besoin de son trop).
Voici donc quelques une de mes GLACES des candidats:
Maintenant ceux qui sont en béton (quoique seulement local, parce que je n'ai pas la configuration de la CCF par les pairs connexion avec un STUN URL) des moyens pour l'autre par les pairs pour se connecter à ma machine.
WebRTC signalisation conseils
Il y a quelques astuces intéressantes sur le fond de cette page. Je honnestly ne pouvait pas vous dire pourquoi vous devriez suivre ces ou pourquoi ils existent en premier lieu, mais je ne les suivent et n'avait pas de problèmes de signalisation. Ici, ils sont:
Vous pouvez gérer tous que du côté client, en ayant une WebRTC finis de l'état de la machine. Veuillez voir la page référencé pour comprendre ce qu'il entend par flux à distance commence à couler.
Essayez de partager la GLACE candidats et les ajouter à l'opposé et au moins suivre les conseils de #1 et #3, et votre application devrait fonctionner à nouveau.
De signalisation de communication
Vous demandé comment faire pour transférer une GLACE candidat à partir d'un poste à un autre dans le cas de la GLACE de candidats important de l'action (ils sont). Pour partager des choses en utilisant AJAX, quelles qu'elles soient, vous pouvez utiliser les boîtes aux lettres. Je crois que vous êtes déjà en plaçant ce qui est dû pour un client dans la base de données.
Chaque fois qu'un de ses pairs, a besoin d'envoyer quelque chose à un autre, et de l'envoyer le plus tôt possible (à l'aide d'AJAX). Sur le côté serveur, la place cette "mail" dans la destination boîte aux lettres du client. Quand un pair (périodiquement) interroge le serveur pour les nouveaux mails, donner tous ses nouveaux mails.
Lorsqu'un SDP offre est créée, la GLACE, les candidats sont rapidement généré. Tous ceux qui GLACE les candidats et le SDP description sera probablement obtenir dans la boîte aux lettres de destination dans un délai de quelques millisecondes. Il y a de bonnes chances que la destination des pairs sondage devez tout à la fois. Même si de la GLACE candidat arrive en retard, son prochain scrutin sera l'obtenir.
Ce n'est pas vraiment répondre à vos questions, mais pour un serveur de signalisation, vous voudrez peut-être jeter un oeil à Socket.io (sur le Nœud). J'ai écrit un codelab expliquant comment le configurer:bitbucket.org/webrtc/codelab. C'est très simple: l'exemple complet est ici: la signalisation en code serveur est d'environ 50 lignes.
SimpleWebRTC exécute le Signalmaster serveur, qui utilise les Socket.io.
(Robert Nyman a écrit un bon post de blog expliquant cela.)
Une autre option est d'utiliser XHR avec la Google API de voie, comme par le apprtc.appspot.com exemple: code ici.
Aucun moyen d'envoyer des messages devraient travailler de manière équivalente. Il peut aider à garder à l'esprit que, ne sont que 4 de base, les messages que vous souhaitez échanger:
SetRemoteDescription
avec elle, puis faire une réponse & envoyerSetRemoteDescription
avec elleaddIceCandidate
avec elleLa glace candidate chose est la partie étrange. Aussi, le candidat de l'objet contient des drôles de personnages, de sorte que lorsque vous l'envoyer, URI de l'encoder. En Coffeescript, le mien ressemble à quelque chose comme:
eepp la réponse est bonne, mais il contient quelques conseils je ne pense pas correct. Plus précisément, ces 3 conseils, je crois, sont tous incorrect:
Ici est une séquence d'évènements que j'ai aujourd'hui (Février 2014) en Chrome. C'est pour un cas simplifié où les pairs 1 va diffuser de la vidéo par les pairs 2.
addIceCandidate
avec elleSetRemoteDescription
avec elle, puis faire une réponse & envoyerSetRemoteDescription
avec ellegetUserMedia
appel)getUserMedia
réussit, c'est un flux. AppeladdStream
sur le peer 1 par des pairs de l'objet de connexion.Je n'ai pas trouvé un moyen d'ajouter de la vidéo après l'étape 9. Lorsque je veux changer quelque chose, je reviens à l'étape 3.