2013-07-04 25 views
9

Oto mój przypadek użycia: Alice ma nowy, ciekawy utwór multimedialny, którego chce, aby Bob słuchał. Wybiera plik multimedialny w swojej przeglądarce i plik multimedialny rozpoczyna się natychmiast w przeglądarce Boba.Przesyłanie strumieniowe plików multimedialnych za pomocą WebRTC

Nie jestem nawet pewien, czy możliwe jest teraz zbudowanie za pomocą interfejsu API WebRTC. Wszystkie przykłady można znaleźć strumieni zastosowania uzyskanych poprzez getUserMedia(), ale to, co mam:

var context = new AudioContext(); 
var pc = new RTCPeerConnection(pc_config); 

function handleFileSelect(event) { 
    var file = event.target.files[0]; 

    if (file) { 
     if (file.type.match('audio*')) { 
      console.log(file.name); 
      var reader = new FileReader(); 

      reader.onload = (function(readEvent) { 
       context.decodeAudioData(readEvent.target.result, function(buffer) { 
        var source = context.createBufferSource(); 
        var destination = context.createMediaStreamDestination(); 
        source.buffer = buffer; 
        source.start(0); 
        source.connect(destination); 
        pc.addStream(destination.stream); 
        pc.createOffer(setLocalAndSendMessage); 
       }); 
      }); 

      reader.readAsArrayBuffer(file); 
     } 
    } 
} 

Po stronie odbiorczej Mam następujący:

function gotRemoteStream(event) { 
    var mediaStreamSource = context.createMediaStreamSource(event.stream); 
    mediaStreamSource.connect(context.destination); 
} 

Kod ten nie czyni media (muzyka) grać po stronie odbiorczej. Jednak otrzymuję zdarzenie zakończone zaraz po zakończeniu uzgadniania WebRTC i wywołaniu funkcji getsRemoteStream. Zostanie wywołana funkcja getRemoteStream , a odtwarzanie multimediów nie rozpocznie się.

Po stronie Alicji magia ma się zdarzyć w linii, która mówi: source.connect (miejsce docelowe). Kiedy zamieniam tę linię na source.connect (context.destination), media zaczynają poprawnie grać przez głośniki Alice.

Po stronie Boba źródło strumienia mediów jest tworzone na podstawie strumienia Alicji. Jednak gdy lokalny głośnik jest podłączony przy użyciu mediaStreamSource.connect (context.destination), muzyka nie rozpoczyna odtwarzania przez głośniki.

Off Oczywiście zawsze mogę wysłać plik multimedialny przez DataChannel ale gdzie jest zabawa w tym, że ...

Wszelkie wskazówki na temat tego, co jest nie tak z moim kodu lub kilka pomysłów na to, jak osiągnąć mój przypadek użycia byłby być bardzo docenionym!

Używam najnowszego i najlepszego Chrome Kanarowego.

Dzięki.

+0

Z powodu błędu w moim kodzie odebrany strumień po stronie Boba został zakończony, ponieważ odpowiedź SDP po stronie Alicji nie została poprawnie przekazana. Po naprawieniu problemu nośnik nadal nie jest odtwarzany, ale przykład zachowuje się inaczej. Odpowiednio zaktualizowałem pytanie. – Eelco

+0

może to być niepowiązane (nie mam doświadczenia z webRTC), ale czy https://github.com/wearefractal/holla może ci pomóc? – rickyduck

Odpowiedz

3

Jest możliwe odtwarzanie dźwięku za pomocą elementu audio tak:

function gotRemoteStream(event) { 
    var player = new Audio(); 
    attachMediaStream(player, event.stream); 
    player.play(); 
} 

Odtwarzanie dźwięku za pośrednictwem interfejsu API WebAudio nie działa dla mnie (jeszcze).

1

Uwaga na pewno na temat Chrome; brzmi jak błąd.

wypróbuj na Firefox (co wieczór proponuję); mamy tam wsparcie WebAudio, chociaż nie znam wszystkich szczegółów na temat tego, co jest aktualnie obsługiwane.

Ponadto, przynajmniej na Firefoksie mamy stream = media_element.captureStreamUntilEnded(); używamy go w niektórych naszych testach w dom/media/tests/mochitests. To pozwala ci wziąć dowolny element audio lub wideo i uchwycić wyjście jako mediastream.

Edytuj: patrz poniżej; zarówno Chrome, jak i Firefox mają problemy z łączeniem WebAudio z WebRTC PeerConnections, ale w różnych miejscach. Mozilla ma nadzieję, że wkrótce naprawi ostatni błąd.

+1

Dzięki za podpowiedź. Próbowałem, ale obecnie FirefoxNightly nie implementuje jeszcze _MediaContext.createMediaStreamSource_. – Eelco

+0

Wykonuje błąd chrome: webaudio nie obsługuje zdalnego przesyłania strumieniowego. tutaj: https://code.google.com/p/chromium/issues/detail?can=2&q=121673&colspec=ID%20Pri%20M%20Iteracja%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20Modified&groupby=&sort= & id = 121673 – Imskull

+0

Tak, teraz Chrome obsługuje WebAudio na wejściach PeerConnection, ale nie na wyjściach (patrz błąd @Imskull powiązany z). Firefox obsługuje WebAudio na wyjściach PeerConnection, ale nie na wejściach. Pozostaje tylko jedna mała kwestia; z tym ustalonym, również to poprzemy. Prawdopodobnie w 39, może 38, * może * 37, jeśli to banalne. – jesup

0

Sprawdź stronę .Obrazuje integrację WebRTC z interfejsem API Web Audio. W szczególności w tym przykładzie jest to istotne dla twojego pytania:

  1. Capture microphone input, visualize it, mix in another audio track and stream the result to a peer
<canvas id="c"></canvas> 
<audio src="back.webm" id="back"></audio> 
<script> 
    navigator.getUserMedia('audio', gotAudio); 
    var streamRecorder; 
    function gotAudio(stream) { 
     var microphone = context.createMediaStreamSource(stream); 
     var backgroundMusic = context.createMediaElementSource(document.getElementById("back")); 
     var analyser = context.createAnalyser(); 
     var mixedOutput = context.createMediaStreamDestination(); 
     microphone.connect(analyser); 
     analyser.connect(mixedOutput); 
     backgroundMusic.connect(mixedOutput); 
     requestAnimationFrame(drawAnimation); 

     peerConnection.addStream(mixedOutput.stream); 
    } 
</script> 

Obawiam się jednak, że jest to tylko propozycja komunikatu.

+0

Niestety, nie będzie działać w Chrome 59. Gdy wykonasz 'peerConnection.addStream (mixedOutput.stream)', pojawi się błąd: 'Nie udało się wykonać 'addStream' w 'RTCPeerConnection': parametr 1 nie jest typu ' MediaStream'. " –

+0

Przy okazji, ten sam błąd w Firefoksie 53:' TypeError: Argument 1 protokołu RTCPeerConnection.addStream nie implementuje interfejsu MediaStream. " –

Powiązane problemy