Streaming audio via php, html5 (et javascript ?)

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, je m'intéresse pour une raison quelconque aux moyens de streamer en live du contenu audio d'un serveur vers un client. Je me suis renseigné sur ce qui existe, et suis tombé sur SHOUTcast, très axé sur le stream de musique, mais qui est propriétaire.

Je me demandais comment techniquement cela pourrait être implémenté avec php et html5. Je m'intéresse surtout au stream de "voix", via un micro (comme une radio traditionnelle).

Est-ce que le html5 serait capable (via getusermedia) de récupérer l'input d'un micro, de l'envoyer à un serveur en asynchrone, que le serveur le mette en mp3 régulièrement et envoie ce bout de mp3 aux clients qui le liront pendant que le serveur récupère un son, le mette un mp3 et l'envoie etc etc ? (système de buffer si je dis pas de bétises). Ou bien c'est totalement inenvisageable à cause des débits des connexions ? S'il existe déjà une façon de procéder je prend, peut être qu'il n'y en a pas du fait que les technologies (html5 surtout) sont récentes :)

merci beaucoup d'avance pour votre aide, bien que ça soit une question atypique ! :)

+0 -0

Hello,

En effet avec getusermedia tu vas pouvoir streamer ton micro mais il faut que tu implémente le serveur toi même car shootcast c'est plutôt fait pour streamer un flux venant d'ailleurs pour le diffuser à un grand nombre de personnes (c'est surtout utilisé pour les radios).

Si tu veux stream du getusermedia il va falloir utiliser les websockets je pense.

+0 -0

Si le format audio permet d'être streamé, pas forcément besoin de websockets: une simple connexion http chunked (PHP sait faire ça bien j'imagine ?) dans laquelle côté serveur tu "pousses" les nouveaux morceaux au rythme auquel ils arrivent doit suffire.

Je l'avais déjà testé (avec de l'ogg je crois). Je recevais des petits bouts de 10s que je "concatenais" au fil de l'eau dans une chunked connection, côté client, une simple balise audio fait l'affaire.

NB : sinon y'a le m3u8 aussi qui fait ça vraiment bien maintenant, mais je ne sais pas quels formats audio il accepte (aac j'imagine :\ ). Ca peut valoir le coup d'y jeter un coup d'oeil.

Édité par Javier

Happiness is a warm puppy

+0 -0
Auteur du sujet

oké super pour vos réponses, une autre question que je me posais est la suivante : si l'input audio est une page html (via getusermedia), il faut bien à un moment ou un autre envoyer cette info au script php (par exemple un chunk de 10s comme tu le présentes @Javier), et l'envoyer à une autre page html Est-ce que faire tout ça via ajax est envisageable ?

Le diffuseur parle dans son micro pendant 20s, au bout de 10 secondes (via js) une requete ajax est envoyée contenant les 10 premieres secondes de données, le script php est lancé avec ce "chunk audio", mais comment l'envoyer a toutes les autres personnes sur la page internet ? est ce que c'est au client (toujours via ajax) de faire des requetes régulières vers le serveur pour voir si des chunks de 10 secondes ont été poussés ?

Il faut aussi en effet que je creuse l'idée des websockets ;)

merci en tout cas pour vos réponses, je reste ouvert à toute idée d'implémentation !

+0 -0

Deux problématiques distinctes dans ton message :

  1. Le découpage du flux entre client (qui enregistre) et serveur. Sur ce plan là je n'ai pas vraiment d'idée, j'ai toujours travaillé avec des softs qui faisaient ça de base et m'envoyaient les chunks un par un

  2. Une fois que les fichiers chunks de 10s sont stockés sur le serveur : les diffuser au client.

Pour le point 2, j'ai testé deux solutions :

  • connexion http "chunked" : quand un client se connecte sur une URL donnée de mon serveur (http://localhost/streamaudio) : je scan tous les fichiers présents dans l'upload audio toutes les N secondes, quand un nouveau fichier est détecté dans ce répertoire, je le "pousse" dans la connexion chunked. Les serveurs dits "aynchrones" (nodejs et compagnie) font ça très bien.

  • m3u8 (HLS) : quand des fichiers arrivent au serveur, je construis une playlist m3u8 (un fichier texte formaté) qui référence un par un tous les fichiers du flux. (cf. la doc Apple), le reste est à la charge du client (si tu ouvres une URL en .m3u8 avec un iDevice tu verras qu'il se débrouille tout seul comme un grand).

Il existe certainement d'autres solutions.

Édité par Javier

Happiness is a warm puppy

+0 -0
Auteur du sujet

En fait c'est la première problématique que je n'explique pas, où le client doit envoyer du son découpé au serveur.

A priori les websockets ne permettent pour l'instant que d'envoyer du texte et du JSON :/

+0 -0

En ce qui concerne la première problématique, je ne sais pas trop ce qu'on peut faire en web très honnêtement…

Un flux de données audio c'est assez compliqué, s'il faut se fader de l'encoding PCM ou ce genre de saletés en JS c'est de la folie.

Tu peux pas utiliser un "client lourd" plutôt pour cette partie là ? Parce que dans ce cas tu utilises la bibliothèque ffmpeg + une bibliothèque réseau (http si ça t'amuse) est le tour est joué…

Y'a même encore plus simple : utiliser ffmpeg (la commande, pas la bibliothèque) pour envoyer les segments au serveur.

Happiness is a warm puppy

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte