【问题标题】:Why is video not displaying when user joins room?为什么用户加入房间时视频不显示?
【发布时间】:2021-03-08 17:01:01
【问题描述】:

所以,我有一个在 vanilla JS 中工作的 https://github.com/Dirvann/mediasoup-sfu-webrtc-video-rooms 的改编版,我正试图适应使用 React。在我的版本中,不是每个用户都是广播者,而是只有房间创建者才是广播者。

我遇到了一个问题。在 React 版本中,当查看者导航到房间时,他们没有收到流!我不知道为什么,因为他们使用相同的 RoomClient 类:https://github.com/Dirvann/mediasoup-sfu-webrtc-video-rooms/blob/master/public/RoomClient.js

这行const consumer = await this.consumerTransport.consume({ id, producerId, kind, rtpParameters, codecOptions, }); 似乎是导致问题的原因,因为它后面的日志没有被打印出来。在消费函数中,执行了我的日志,上面写着“hi”,但没有执行“blah”。 这是客户端控制台的屏幕截图:

最重要的功能如下所示。全班请点击上面的github链接。

  async consume(producer_id) {
    //let info = await roomInfo()
    console.log('consume ', producer_id);
    console.log('dddddddddddd', await this.getConsumeStream(producer_id));
    this.getConsumeStream(producer_id).then(
      function ({ consumer, stream, kind }) {
        console.log('blah');
        this.consumers.set(consumer.id, consumer);

        let elem;
        console.log('clg kind === ', kind);
        if (kind === 'video') {
          console.log('cons vid');
          elem = document.createElement('video');
          elem.srcObject = stream;
          elem.id = consumer.id;
          elem.playsinline = false;
          elem.autoplay = true;
          elem.className = 'vid';
          this.remoteVideoEl.appendChild(elem);
        } else {
          elem = document.createElement('audio');
          elem.srcObject = stream;
          elem.id = consumer.id;
          elem.playsinline = false;
          elem.autoplay = true;
          this.remoteAudioEl.appendChild(elem);
        }

        consumer.on(
          'trackended',
          function () {
            this.removeConsumer(consumer.id);
          }.bind(this)
        );
        consumer.on(
          'transportclose',
          function () {
            this.removeConsumer(consumer.id);
          }.bind(this)
        );
      }.bind(this)
    );
  }

  async getConsumeStream(producerId) {
    const { rtpCapabilities } = this.device;
    console.log('rtpcaps ', rtpCapabilities);
    const data = await this.socketRequest('consume', {
      rtpCapabilities,
      consumerTransportId: this.consumerTransport.id, // might be
      producerId,
    }).then((data) => {
      console.log('daaatttaaa', data);
      return data;
    });
    const { id, kind, rtpParameters } = data;

    console.log('data === ', data);

    let codecOptions = {};
    console.log('aaaaaaaaaaaaaa', this.consumerTransport.consume);
    const consumer = await this.consumerTransport
      .consume({
        id,
        producerId,
        kind,
        rtpParameters,
        codecOptions,
      })
      .then((result) => {
        console.log('bbbbbbb', result);
        return result;
      });
    console.log('consumer === ', consumer);

    const stream = new MediaStream();
    console.log('stream === ', stream);
    stream.addTrack(consumer.track);
    console.log('kind ', kind);
    return {
      consumer,
      stream,
      kind,
    };
  }

非常感谢您的宝贵时间

---更新---

这条线永远不会解决:const consumer = await this.consumerTransport.consume({ id, producerId, kind, rtpParameters, codecOptions, }) 它最终从包中执行一些看起来很复杂的函数。实际上,在 mediasoup-client 中执行了几行之后,它似乎陷入了一个名为 sdp-transform 的包中的无限循环。

我什至不明白 chrome 调试器是如何工作的。因为如果我在调用...consume(... 的那一行上放一个断点,然后单击“步骤”,它会解析这一行:let answer = await this._pc.createAnswer() ...这是一个名为receive 的函数的一部分,它不是由断点线...请有人帮忙。

【问题讨论】:

  • 请注意,您的代码.bind(this)() 会立即执行绑定函数,而不是等待。应该只是.bind(this)
  • 对不起,我错误地包含了它,它不在我的代码库中。我更新了上面的代码以反映我的代码库。
  • 你的代码库在某个 github 链接中可用吗?
  • 给我 20 分钟,我会给你一个链接。干杯。

标签: javascript node.js reactjs webrtc mediasoup


【解决方案1】:

你在那里说了一些有趣的话。 'hi' 会被记录,而 'blah' 不会。它们之间没有太多代码。这应该让我们想知道它是怎么可能的。

也许可以在没有任何干扰的情况下创建相同的内容。

Promise.resolve()
    .then(console.log('hi'))
    .then(function() {
        console.log('blah');
    })

那会做什么?为什么?

.then 是一个函数,它期望被赋予一个函数(在 promise 解决时被调用......)

console.log('hi') 返回什么?什么时候执行?

您不想在创建承诺链时执行日志,并且您还想再次返回结果,因为您想使用该值。

所以我的猜测是。将其更改为:

.then(result => {
    console.log('hi')
    return result
})

至少让你更近了一步。

【讨论】:

  • 谢谢,我不擅长承诺链,所以我在那里学到了一些东西。无论如何,在我添加 .then(... console.log('hi')) 之前它没有加入房间。您的评论很有帮助,但不是解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 2019-01-07
  • 2012-05-13
  • 2018-01-27
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多