2017-01-23 2 views
2

In this document wird die Videoquelle mit URL.createObjectURL festgelegt. (Dies ist der Code, um einen Anruf zu beantworten).Warum wird die WebRTC-Remotevideoquelle von URL.createObjectURL generiert?

Ich erwartete video.src, um die Adresse zu sein, um das entfernte Video abzurufen. Es sollte also festgelegt und von der anderen Seite der Verbindung (wer auch immer den Anruf initiiert hat) gegeben werden. Aber der Wert URL.createObjectURL wird auf der Seite des Antwortsenders generiert, und das Ereignis hängt davon ab, wann die Funktion aufgerufen wird. Wie kann es verwendet werden, um den Remote-Video-Stream zu erhalten?

Bearbeiten: Das Ergebnis von URL.createObjectURL sieht aus wie Blob: http://some.site.com/xxxx-the-token-xxxx. Wie weiß die Videokomponente mit dieser Zeichenfolge, wo der Remote-Stream geladen werden soll? Wird irgendwo eine Hashmap von {url: stream} gespeichert? Wenn ja, wie greift die Videokomponente auf die Hashmap zu?

Ein Stream-Objekt speichert eine Token-Zeichenfolge, die Sie mit stream.toURL erhalten können. Aber es ist anders als das Ergebnis von URL.createObjectURL. Der Wert URL.createObjectURL hängt von der Zeit ab. Wenn Sie es zweimal hintereinander aufrufen, erhalten Sie unterschiedliche Werte.

Antwort

6

URL.createObjectURL(stream) ist ein Hack. Hör auf es zu benutzen. Bemühungen sind im Gange remove it.

Verwenden Sie stattdessen direkt video.srcObject = stream. Es ist Standard und gut umgesetzt.

Diese Zuordnung einer lokalen Ressource sollte eigentlich nie eine URL sein und ist ein Vorwand, um zu verstehen, wie WebRTC funktioniert.

WebRTC ist eine Übertragungs-API, die Daten direkt von einem Peer zum anderen sendet. Keine Inhalts-URLs sind beteiligt. Die Fernbedienung stream, die Sie von onaddstream erhalten, ist eine lokale Objektempfängerseite und ist das Live-Streaming-Ergebnis der Übertragung, das abgespielt werden kann.

Die Dokumentation, die Sie lesen, ist alt und veraltet. Danke, dass du es aufgezeigt hast, ich werde es reparieren. Es hat andere Probleme: Sie sollten setRemoteDescription sofort aufrufen, nicht warten, bis der Empfänger ihre Kamera zu teilen, sonst eingehende Kandidaten werden verpasst. Anstelle der Code, den Sie zeigen, dies tun:

pc.onaddstream = e => video.srcObject = e.stream; 

function getOfferFromFriend(offer) { 
    return pc.setRemoteDescription(new RTCSessionDescription(offer)) 
    .then(() => navigator.getUserMedia({video: true})) 
    .then(stream => { 
     pc.addStream(stream); 
     return pc.createAnswer(); 
    }) 
    .then(answer => pc.setLocalDescription(answer)) 
    .then(() => { 
     // send the answer to a server to be forwarded back to the caller (you) 
    }) 
    .catch(error); 
} 

Es srcObject verwendet, vermeidet die veralteten Callback-API, und nicht intermittierend ICE Ausfälle verursachen.

+0

Danke jib! Dies half mir, die Ursachen für mein Problem einzugrenzen. Aber ich kann mein ursprüngliches Problem immer noch nicht verstehen. Können Sie sich bitte meine Frage [hier] (http://stackoverflow.com/q/41917545/3838949) ansehen? Mein iceConnectionState springt von "checking" zu "closed". Ich bin mir nicht sicher, was das Problem verursacht. –

1

Da eine WebRTC-Verbindung mehrere Schritte umfasst und was Sie von einer solchen Verbindung erhalten, ist ein Stream. Die src-Eigenschaft des Tags video akzeptiert jedoch keinen Stream, sondern eine URL. Und das ist der Weg, um einen Stream in eine URL zu "konvertieren".

+0

Ich verstehe, dass Sie eine URL benötigen, aber ich verstehe nicht, warum die URL auf diese Weise generiert wird. Ich bin in einer Situation, in der ich "URL.createObjectURL" selbst schreiben muss, weil es in React Native nicht verfügbar ist. Also habe ich versucht, 'stream.toURL' zu verwenden, die ein anderes Token erzeugen als das, was 'URL.createObjectURL' produziert. Es scheint, dass die Videokomponente das Remote-Video mit diesem Token nicht richtig abrufen kann. Der Wert von 'stream.toURL' macht mir mehr Sinn, weil es nicht von der Zeit abhängt. –

+0

Das Ergebnis von "URL.createObjectURL" sieht wie folgt aus: "blob: http: // some.site.com/xxxx-the-token-xxxx". Wie weiß die Videokomponente mit dieser Zeichenfolge, wo der Remote-Stream geladen werden soll? Gibt es irgendwo eine Hazhmap von '{url: stream}'? Wenn ja, wie greift die Videokomponente auf die Hashmap zu? –

+0

Diese Zuordnung ist intern im Browser.Ich glaube nicht, dass Sie auf irgendeine Weise darauf zugreifen/kontrollieren können. –

Verwandte Themen