Veröffentlichen: Diagnostik

In diesem Leitfaden erfahren Sie, wie Sie Diagnosen für Verlage erstellen und häufige Probleme beheben können.

Abrufen von Statistiken über den Stream eines Verlegers

Die Publisher.getStats() Methode liefert Ihnen ein Array von Objekten, die die aktuellen Audio-Video-Statistiken für den Publisher definieren. Für einen Herausgeber in einer gerouteten Sitzung (eine, die den Media Router verwendet), enthält dieses Array ein Objekt, das die Statistiken für den einzelnen Audio-Media-Stream definiert, der an den OpenTok Media Router gesendet wird. In einer weitergeleiteten Sitzung enthält das Array ein Objekt für jeden Abonnenten des veröffentlichten Streams. Jedes Objekt im Array enthält eine stats die die folgenden Eigenschaften enthält:

  • Die Gesamtzahl der gesendeten Audio- und Videopakete
  • Die Gesamtzahl der verlorenen Audio- und Videopakete
  • Die Gesamtzahl der gesendeten Audio- und Videobytes
  • Die aktuelle durchschnittliche Videobildrate

Außerdem enthält jedes Objekt im Array für einen Verleger in einer weitergeleiteten Sitzung die folgenden zwei Eigenschaften:

  • connectionId - Die eindeutige ID der Verbindung des Clients, die mit der id Eigenschaft der connection Eigenschaft der connectionCreated Ereignis, das das Session-Objekt für den Remote-Client ausgelöst hat.
  • subscriberId - Die eindeutige ID des Teilnehmers, die mit der id Eigenschaft des Subscriber-Objekts in der Anwendung des abonnierenden Clients.

Diese beiden Eigenschaften sind für einen Verleger in einer gerouteten Sitzung nicht definiert.

Um detailliertere Stream-Statistiken zu erhalten, verwenden Sie die Publisher.getRtcStatsReport() Methode. Sie gibt ein Versprechen zurück, das im Erfolgsfall mit einem Array von RTCStatsReport Objekte.

Der OTP-Verlag audioNetworkStats und audioNetworkStats Ereignisse liefern ein Array von Objekten, die die aktuellen Audio- oder Videostatistiken für den Herausgeber definieren. Für einen Verleger in einer gerouteten Sitzung (eine, die die Medien-Router), enthalten diese Ereignis-Arrays jeweils ein Objekt, das die Statistiken für die Audio- oder Videodaten definiert, die an den Medien-Router. In einer weitergeleiteten Sitzung enthält das Array ein Objekt für jeden Abonnenten des veröffentlichten Streams. Jedes Objekt im Array hat die folgenden Eigenschaften:

videoBytesSent - Die Gesamtzahl der gesendeten Audio- und Videobytes videoPacketsSent - Die Gesamtzahl der gesendeten Audio- und Videopakete videoPacketsSent - Die Gesamtzahl der verlorenen Audio- und Videopakete Zusätzlich enthält jedes Objekt im Array für einen Publisher in einer weitergeleiteten Sitzung die folgenden zwei Eigenschaften:

connectionId - Die eindeutige ID der Verbindung des abonnierenden Clients, die mit der Eigenschaft connectionId des Ereignisses connectionCreated für die Verbindung dieses Clients übereinstimmt.

subscriberId - Die eindeutige ID des Teilnehmers.

Der folgende Code protokolliert diese Statistiken für den Stream des Herausgebers jede Sekunde:

<OTPublisher
  eventHandlers={{
    audioNetworkStats: event => {
      console.log('publisher audioNetworkStats event', event);
    },
    videoNetworkStats: event => {
      console.log('publisher videoNetworkStats event', event);
    },
  }}
/>

Um detailliertere Stream-Statistiken zu erhalten, verwenden Sie die OTPublisher.getRtcStatsReport() Methode. Der Aufruf dieser Methode führt dazu, dass die OTPublisher-Instanz eine rtcStatsReport Veranstaltung:

<OTPublisher
  eventHandlers={{
    streamCreated: event => {
      console.log('publisher streamCreated', event);
      setTimeout(() => this.publisher.getRtcStatsReport(), 12000)
    },
    rtcStatsReport: event => {
      console.log('publisher rtcStatsReport event', event);
    },
  }}
/>

Für einen Publisher in einer gerouteten Sitzung enthält das Event-Array ein Objekt, das die Statistiken des an den OpenTok Media Router gesendeten Streams definiert. In einer weitergeleiteten Sitzung enthält das Array ein Objekt, das die RTC Stats Reports für jeden Teilnehmer des veröffentlichten Streams definiert. Jedes Objekt im Array hat eine jsonArrayOfReports Eigenschaft, die die Daten enthält. Die Struktur des JSON-Arrays ähnelt dem Format des in Webbrowsern implementierten RtcStatsReport-Objekts (siehe die Mozilla-Dokumente). Siehe auch dies W3C-Dokumentation.

Test stream

Sie können einen Teststream veröffentlichen und dessen Audio- und Videostatistiken überprüfen, um die Art des Streams (z. B. hochauflösend oder nur Audio) zu ermitteln, die von Ihrer Verbindung unterstützt wird.

Um Statistiken für einen Stream zu erhalten, der vom lokalen Client veröffentlicht wurde, müssen Sie eine Sitzung verwenden, die den Media Router nutzt (Sitzungen, bei denen der Medienmodus auf geroutet eingestellt ist), und Sie müssen die Option testNetwork Eigenschaft zu true im options Objekt, das Sie an die Session.subscribe() Methode. Sie können dann die getStats() Methode des Subscriber-Objekts, um Audio- und Videostatistiken für den von Ihnen veröffentlichten Stream zu erhalten.

Bewährte Praktiken bei der Veröffentlichung

Dieser Abschnitt enthält Tipps für die erfolgreiche Veröffentlichung von Streams.

Zugriff auf das Gerät zulassen

Es empfiehlt sich, die Nutzer darüber zu informieren, dass sie aufgefordert werden, den Zugriff auf ihre Kamera und ihr Mikrofon zu gestatten.

Wir haben festgestellt, dass die weitaus meisten Fehler bei der Veröffentlichung darauf zurückzuführen sind, dass Benutzer auf die Schaltfläche "Verweigern" klicken oder die Schaltfläche "Zulassen" überhaupt nicht anklicken. Wir stellen Ihnen alle Ereignisse zur Verfügung, die Sie benötigen, um Ihre Benutzer durch diesen Prozess zu führen:

publisher.on({
  accessDialogOpened: function (event) {
    // Show allow camera message
    pleaseAllowCamera.style.display = 'block';
  },
  accessDialogClosed: function (event) {
    // Hide allow camera message
    pleaseAllowCamera.style.display = 'none';
  }
});

Es ist auch eine gute Idee, Ihre Website über SSL bereitzustellen. Der Grund dafür ist, dass Chrome von den Nutzern nur einmal pro Domain verlangt, den Zugriff auf Geräte zu erlauben, wenn diese Domain über SSL bereitgestellt wird. Das bedeutet, dass Ihre Nutzer (wenn sie Chrome verwenden) nicht jedes Mal, wenn sie die Seite laden, mit dem lästigen Dialogfeld "Zulassen/Ablehnen" konfrontiert werden.

OT.initPublisher() und Session.publish() aufteilen

Außerdem empfehlen wir die Aufteilung der OT.initPublisher() und Session.publish() Schritte. Dadurch wird die anfängliche Verbindungszeit verkürzt, da Sie eine Verbindung zur Sitzung herstellen, während Sie darauf warten, dass der Benutzer auf die Schaltfläche "Zulassen" klickt. Also statt:

session.connect(token, function (err) {
{... your error handling code ...}
if (!err) {
    var publisher = OT.initPublisher();
    session.publish(publisher);
  }
});

Bewegen Sie die OT.initPublisher() bevor Sie eine Verbindung herstellen, wie im Folgenden beschrieben:

var publisher = OT.initPublisher();
session.connect(token, function (err) {
{... your error handling code ...}
  if (!err) {
    session.publish(publisher);
  }
});

Auflösung und Bildrate

Sie können die Auflösung und die Bildrate des Publishers bei der Initialisierung einstellen:

OT.initPublisher(divId, {
  resolution: '320x240',
  frameRate: 15
});

Standardmäßig ist die Auflösung eines Publishers 640x480, aber Sie können sie auch auf 1920x1080, 1280x720 oder 320x240 einstellen. Am besten versuchen Sie, die Auflösung an die Größe anzupassen, in der das Video angezeigt werden soll. Wenn Sie das Video nur mit 320x240 Pixeln anzeigen, macht es keinen Sinn, mit 1280x720 oder 1920x1080 zu streamen. Durch die Verringerung der Auflösung können Sie Bandbreite sparen und Überlastungen und Verbindungsabbrüche vermeiden.

Standardmäßig beträgt die Bildrate des Videos 30 Bilder pro Sekunde, aber Sie können sie auch auf 15, 7 oder 1 einstellen. Durch die Verringerung der Bildrate kann die erforderliche Bandbreite reduziert werden. Videos mit geringerer Auflösung können eine niedrigere Bildrate haben, ohne dass der Benutzer einen großen Unterschied bemerkt. Wenn Sie also eine niedrige Auflösung verwenden, sollten Sie auch eine niedrige Bildrate in Betracht ziehen.

Fehlersuche

Befolgen Sie die Tipps in diesem Abschnitt, um Konnektivitätsprobleme bei der Veröffentlichung zu vermeiden. Allgemeine Informationen zur Fehlerbehebung finden Sie unter Fehlersuche - Web.

Umgang mit Fehlern

Es gibt Callback-Methoden für beide Session.publish() und OT.initPublisher(). Wir empfehlen, die Fehlerantworten auf diese beiden Methoden zu behandeln. Wie bereits erwähnt, ist es am besten, diese Schritte aufzuteilen und die OT.initPublisher() bevor Sie mit der Verbindung zu Ihrer Sitzung begonnen haben. Es erleichtert auch die Fehlerbehandlung, wenn Sie nicht beide Methoden gleichzeitig aufrufen. Der Grund dafür ist, dass beide Fehlerbehandlungsmethoden ausgelöst werden, wenn ein Fehler veröffentlicht wird. Es ist am besten, zu warten, bis OT.initPublisher() zu vervollständigen und Session.connect() zu vervollständigen, und rufen Sie dann Session.publish(). Auf diese Weise können Sie alle hardwarebezogenen Probleme in der OT.initPublisher() Rückruf und alle netzbezogenen Fragen in der Session.publish() Rückruf.

var connected = false,
  publisherInitialized = false;

var publisher = OT.initPublisher(function(err) {
  if (err) {
    // handle error
  } else {
    publisherInitialized = true;
    publish();
  }
});

var publish = function() {
  if (connected && publisherInitialized) {
    session.publish(publisher);
  }
};

session.connect(token, function(err) {
  if (err) {
    // handle error
  } else {
    connected = true;
    publish();
  }
});

Zugang verweigert

Die höchste Anzahl von Misserfolgen bei OT.initPublisher() sind darauf zurückzuführen, dass der Endnutzer den Zugang zu Kamera und Mikrofon verweigert. Dies kann entweder durch Abhören des accessDenied Ereignis oder durch Abwarten einer Fehlerantwort auf die Methode OT.initPublisher() mit einer code Eigenschaft auf 1500 gesetzt und eine message Eigenschaft auf "Publisher Access Denied:" gesetzt. Wir empfehlen, dass Sie diesen Fall behandeln und dem Benutzer eine Meldung anzeigen, dass er versuchen sollte, erneut zu veröffentlichen und den Zugriff auf die Kamera zu erlauben.

publisher.on({
  'accessDenied': function() {
    showMessage('Please allow access to the Camera and Microphone and try publishing again.');
  }
});

Zugang zum Gerät

Ein weiterer Grund für OT.initPublisher() Wenn OpenTok nicht auf eine Kamera oder ein Mikrofon zugreifen kann, schlägt das Programm fehl. Dies kann passieren, wenn keine Kamera oder kein Mikrofon an den Rechner angeschlossen ist, wenn etwas mit dem Treiber für die Kamera oder das Mikrofon nicht stimmt oder wenn eine andere Anwendung die Kamera oder das Mikrofon verwendet (dies geschieht nur unter Windows). Sie können versuchen, das Auftreten dieser Probleme zu minimieren, indem Sie unsere Hardware-Setup-Komponente verwenden oder die Funktion OT.getDevices() Methode direkt. Sie sollten jedoch auch jeden Fehler behandeln, wenn Sie OT.initPublisher() denn es kann immer noch etwas schief gehen. Zum Beispiel könnte der Benutzer den Zugriff auf die Kamera oder das Mikrofon verweigert haben. In diesem Fall muss die error.name Eigenschaft wird auf "OT_USER_MEDIA_ACCESS_DENIED":

publisher = OT.initPublisher('publisher', {}, function (err) {
  if (err) {
    if (err.name === 'OT_USER_MEDIA_ACCESS_DENIED') {
      // Access denied can also be handled by the accessDenied event
      showMessage('Please allow access to the Camera and Microphone and try publishing again.');
    } else {
      showMessage('Failed to get access to your camera or microphone. Please check that your webcam'
        + ' is connected and not being used by another application and try again.');
    }
    publisher.destroy();
    publisher = null;
  }
});

Netzwerk-Fehler

Die anderen Gründe für Fehler bei der Veröffentlichung sind in der Regel auf eine Art von Netzwerkfehler zurückzuführen. Wir behandeln diese in dem Callback zu Session.publish(). Wenn der Benutzer nicht mit dem Netz verbunden ist, wird der Callback-Funktion ein Fehlerobjekt mit dem name Eigenschaft eingestellt auf "OT_NOT_CONNECTED". Wenn der Benutzer über eine sehr restriktive Netzwerkverbindung verfügt, die keine WebRTC-Verbindungen zulässt, kann der Publisher keine Verbindung herstellen, und das Publisher-Element zeigt ein sich drehendes Rad an. Dieser Fehler hat eine name Eigenschaft eingestellt auf "OT_CREATE_PEER_CONNECTION_FAILED". In diesem Fall empfiehlt es sich, dem Benutzer eine Nachricht zu übermitteln, die ihn darauf hinweist, dass die Veröffentlichung fehlgeschlagen ist und dass er seine Netzwerkverbindung überprüfen sollte. Die Behandlung dieser Fehler sieht folgendermaßen aus:

session.publish(publisher, function(err) {
  if (err) {
    switch (err.name) {
      case "OT_NOT_CONNECTED":
        showMessage("Publishing your video failed. You are not connected to the internet.");
        break;
      case "OT_CREATE_PEER_CONNECTION_FAILED":
        showMessage("Publishing your video failed. This could be due to a restrictive firewall.");
        break;
      default:
        showMessage("An unknown error occurred while trying to publish your video. Please try again later.");
    }
    publisher.destroy();
    publisher = null;
  }
});

Verlust der Konnektivität

Ihr Publisher kann auch die Verbindung verlieren, nachdem er bereits eine Verbindung hergestellt hat. In den meisten Fällen führt dies dazu, dass auch die Sitzung ihre Verbindung verliert, aber das ist nicht immer der Fall. Sie können das Trennen der Verbindung des Publishers behandeln, indem Sie auf die streamDestroyed Ereignis mit einer reason Eigenschaft auf "networkDisconnected" wie folgt eingestellt:

publisher.on({
  streamDestroyed: function (event) {
    if (event.reason === 'networkDisconnected') {
      showMessage('Your publisher lost its connection. Please check your internet connection and try publishing again.');
    }
  }
});