Wysyłanie MediaStream do serwera hosta z WebRTC po przechwyceniu przez getUserMedia

Przechwytuję dane audio za pomocą getUserMedia() i chcę wysłać je na mój serwer, aby móc zapisać je jako Blob w polu MySQL.

Tylko to próbuję zrobić. Zrobiłem kilka prób, aby to zrobić za pomocą WebRTC, ale nawet nie wiem w tym momencie, czy to jest właściwe, czy nawet najlepszy sposób, aby to zrobić. Czy ktoś może mi pomóc?

Oto kod, którego używam do przechwytywania dźwięku z mikrofonu:

navigator.getUserMedia({
    video:false,
    audio:true,
},function(mediaStream){

    // output mediaStream to speakers:
    var mediaStreamSource=audioContext.createMediaStreamSource(mediaStream);
    mediaStreamSource.connect(audioContext.destintion);

    // send mediaStream to server:

    // WebRTC code? not sure about this...
    var RTCconfig={};
    var conn=new RTCPeerConnection(RTCconfig);

    // ???

},function(error){
    console.log('getUserMedia() fail.');
    console.log(error);
});

Jak mogę to wysłać mediaStream do serwer?

Po Wygooglowaniu wokół Szukałem WebRTC, ale wydaje się, że jest to tylko komunikacja peer to peer - właściwie, teraz patrzę na to bardziej, myślę, że to jest droga do zrobienia. Wydaje się, że jest to sposób komunikowania się z przeglądarki klienta do serwera hosta, ale nic, co próbuję, nawet nie zbliża się do działania.

Przeglądałem dokumentację W3C (która wydaje mi się zbyt abstrakcyjna), i przechodziłem przez to artykuł o HTML5 Rocks (który przynosi więcej pytań niż odpowiedzi). Najwyraźniej potrzebuję metody sygnalizacji, czy ktoś może doradzić która metoda sygnalizacji jest najlepsza do wysyłania mediaStreams, XHR, XMPP, SIP, Socket.io albo coś innego?

Co będę potrzebował na serwerze, aby obsługiwać odbiór WebRTC? Na moim serwerze działa podstawowy stos LAMP.

Poza tym, czy najlepiej poczekać do zakończenia nagrywania mediaStream zanim wyślę go na serwer, czy lepiej wysłać mediaStream jako jego zapis? Chcę wiedzieć, czy dobrze to robię. Pisałem pliki uploadery w javascript i HTML5, ale wgrywanie jednego z nich mediaStreams wydaje się piekielnie bardziej skomplikowane i nie jestem pewien, czy zbliżam się do niego dobrze.

Każda pomoc w tym zakresie będzie bardzo mile widziana.
Author: PGCodeRider, 2014-08-27

2 answers

Nie można przesłać samej transmisji na żywo podczas jej działania. To dlatego, że jest to transmisja na żywo.

Więc, to pozostawia Ci kilka opcji.

  1. Nagraj strumień audio za pomocą jednego z wielu rejestratorów RecordRTC działa dość dobrze. Poczekaj, aż strumień zostanie ukończony, a następnie prześlij plik.
  2. Wyślij mniejsze kawałki nagranego dźwięku z timerem i połącz je ponownie po stronie serwera. Oto przykład tego
  3. Wyślij Pakiety audio, które występują przez websockets do serwera, dzięki czemu można manipulować i łączyć je tam. moja wersja RecordRTC robi to .
  4. nawiąż rzeczywiste połączenie peer z serwerem, aby mógł przechwycić surowy strumień rtp i możesz nagrać strumień za pomocą kodu niższego poziomu. Można to łatwo zrobić za pomocą Janus-Gateway.

Jeśli chodzi o czekanie na wysłanie strumienia vs wysyłanie go w kawałkach, wszystko zależy od tego, jak długo nagrywasz. Jeśli jest dla dłuższy okres czasu, powiedziałbym wysyłanie nagrania w kawałkach lub aktywne wysyłanie pakietów audio przez websockets jest lepszym rozwiązaniem, ponieważ przesyłanie i przechowywanie większych plików audio od strony Klienta może być uciążliwe dla klienta.

Firefox faktycznie ma własne rozwiązanie its do nagrywania , ale nie jest obsługiwane w chrome, więc może nie działać w twojej sytuacji.

Na marginesie, wspomniana metoda sygnalizacji służy do budowania/niszczenia sesji i naprawdę nie ma nic wspólnego z z samym mediami. Tylko naprawdę martwić się o to, jeśli używasz ewentualnie rozwiązanie numer 4 pokazane powyżej.

 35
Author: Benjamin Trent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 12:53:44

Dobrym API dla ciebie będzie MediaRecorder API, ale jest mniej obsługiwane niż Web Audio API, więc możesz to zrobić za pomocą ScriptNode lub użyj Recorder.js (lub bazuj na nim, aby zbudować własny kod skryptu).

 3
Author: Luizgrs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 13:01:47