取消发布出版商并尝试在不工作后立即发布

时间:2018-05-13 17:59:44

标签: javascript webrtc opentok tokbox

我在浏览器中使用tokbox javascript sdk。 我无法重新创建发布商。我的情况是这样的:

  1. 我创建了一个广播音频和视频的发布商
  2. 在某个时刻,我想将音频源切换到另一个MediaStream源。
  3. 我在会话中取消发布上一个发布者并在回调中将其销毁
  4. 我尝试使用此新配置创建新发布商。
  5. 当我这样做时,我最终得到以下错误:

    Session.publish, could not publish in a reasonable amount of time.

    我在SO和网上搜索了一些答案。我遇到过类似thisthis等类似问题的人,但他们都没有这个问题的答案。

    基本上,我要么想知道如何改变已经广播的现有发布者(在音频和视频源配置方面),或者在我尝试时我对发布者的生命周期做错了什么创建一个新的。

    在拥有第一个发布者时创建第二个发布者似乎工作正常,但首先销毁一个然后尝试创建一个新发布者似乎会产生所描述的问题。

    以下是示例代码:

    // returns existing publisher
    const existing = selectPublisher(getState()); 
    
    if (existing) {
      session.unpublish(existing);
      existing.destroy();
      console.log('destroyed.');
    }
    
    const publisher = OT.initPublisher(
      'publisher-container',
      finalOptions,
      error => {
        console.log(error);
      }
    );
    
    session.publish(publisher, error => {
      console.log(error);
    });
    

    发布商的初始化似乎有效,它会打印undefined。 打印结束时:

    index.js:2177 OT.Publisher.onPublishingTimeout
    index.js:2177 OT.exception :: title: Unable to Publish (1500) msg: ICEWorkflow
    index.js:2177 1500 "Session.publish :: Could not publish in a reasonable amount of time"
    

    我使用的是opentok npm客户端软件包版本2.14.2

    编辑:

    似乎问题是由我传入发布者的选项引起的,如果我只使用默认选项(不将任何内容传入发布者),上面的示例工作正常。

    我正在使用两个MediaStreamTrack个对象,一个用于音频和视频,使用OT.getUserMedia(options)收集。看起来它是第一次正常工作,但是一旦我使用相同的两个MediaStreamTrack对象取消发布和重新发布,我就遇到了这个问题。

    我传递的对象看起来像这样(来自chrome控制台):

    audioSource: MediaStreamTrack {kind: "audio", id: "9414787b-82b9-48c3-99bd-3208b46c2f9f", label: "Built-in Microphone", enabled: true, muted: false, …}

    videoSource: MediaStreamTrack {kind: "video", id: "3f20c926-7d0c-4537-8e8d-ef4b22393a58", label: "FaceTime HD Camera", enabled: true, muted: false, …}

1 个答案:

答案 0 :(得分:3)

TokBox Developer Evangelist在这里。

当您销毁发布商时,我们会在MediaStreamTrack上调用stop方法,这就是您无法再次使用相同的MediaStreamTrack选项的原因。要防止这种情况发生,请在MediaStreamTrack上调用clone方法,并在初始化发布者时将克隆作为选项传递。