Ошибка WebRTC111: DOMException [InternalError: "Невозможно создать предложение без локальных треков, без offerToReceiveAudio/Video и без DataChannel

Я создаю потоковую службу, используя webrtc+janusgateway+streamCapture.

Это начинает потоковое видео:

  public streamVideo() {
    var video = $('#video1').get(0);
        var stream;

    video.onplay = () => {
      if (video.captureStream) {
        stream = video.captureStream();
      } else if (video.mozCaptureStream) {
        stream = video.mozCaptureStream();
      } else {
        alert('captureStream() not supported');
      }

            console.log(stream);
      $("#secondvideoforll").get(0).srcObject = stream;

    this.sfutest.createOffer(
      {
        media: { audioRecv: 0, videoRecv: 0, audioSend: 1, videoSend: 1}, // Publishers are sendonly
        stream: stream,
        success: (jsep) => {
          Janus.debug("Got publisher SDP!");
          Janus.debug(jsep);
          var publish = { "request": "configure", "audio": 1, "video": 1 };
          this.sfutest.send({"message": publish, "jsep": jsep});
        },
        error: (error) => {
          Janus.error("WebRTC111 error:", error);
        }
      });
    }
  }

Воспроизведение видео работает отлично, но когда я пытаюсь создать предложение (и далее addStream). Я получаю эту ошибку:

WebRTC111 error: DOMException [InternalError: "Cannot create an offer with no local tracks, no offerToReceiveAudio/Video, and no DataChannel."
code: 0
nsresult: 0x0]

Создание того же предложения (без параметра потока) работает для потоковой передачи веб-камеры, но не для потокового видео.

Основное отличие, которое я обнаружил, заключается в том, что веб-камера использует: LocalMediaStreamв то время как мой streamCapture использует MediaStream.

Есть идеи на этот счет?

2 ответа

Решение

При вызове video.captureStream() getTracks() возвращает пустой массив, но через 1,5 секунды возвращает треки, как и ожидалось.

Произошла ошибка, если не добавлено ни одного трека: Ошибка WebRTC111: DOMException [InternalError: "Невозможно создать предложение без локальных треков, без offerToReceiveAudio/Video и без DataChannel

Добавление этого в целях документооборота, так как другие могут найти это запутанным.

Решение:

setInterval(function(){
// We wait till the mediaTracks are added to mediaStream
console.log(stream.getTracks());
// Further actions with the mediaStream
}, 1000);

Спасибо!

Ссылка: https://github.com/w3c/webrtc-pc/issues/923

Это потому, что вы захватываете поток перед воспроизведением видео. Вам необходимо захватить поток после того, как видео начало воспроизводиться, чтобы избежать задержки в треках потока.

Вместо setTimeout лучше использовать:

  • Используйте метод await on video.play() и после этого захватите поток.
  • Используйте событие onplay элемента video для захвата потока при воспроизведении видео.
Другие вопросы по тегам