【问题标题】:Does getUserMedia give same or new stream when called more than once?getUserMedia 是否在多次调用时提供相同或新的流?
【发布时间】:2020-07-27 08:16:29
【问题描述】:

如果您的应用想要获得相同的用户媒体,例如具有完全相同约束的音频,不止一次,navigator.mediaDevices.getUserMedia 调用会返回一个新流,因此将分配相同数量的计算资源,还是只是为您提供相同的流(具有相同引用的相同对象)因此不使用额外资源?

我正在将用户的音频流传输给应用程序的另一个用户。在某个时候,第三个或更多用户将加入,他们需要第一个用户向第二个用户传输的相同音频传输给他们自己。

我希望与不为同一音频流的副本分配新资源一样高效。

我应该再次调用navigator.mediaDevices.getUserMedia,它会给我以前给我的相同流(相同的引用),还是我不应该这样做,因为它会给我一个新的音频流,即使我提供的约束是完全一样,我应该只是重用以前返回的音频流,比如将它存储在一个变量中?

我的调查表明流'MediaStreamobjects')ids 是不同的。看起来它们是不同的对象。

const str = await navigator.mediaDevices.getUserMedia({audio: true})
MediaStream {  ​
active: true    ​
id: "{f3b334cd-8507-408f-94e9-40b42bbd73f6}"
...
}

const str1 = await navigator.mediaDevices.getUserMedia({audio: true})
MediaStream {
active: true
id: "{ec94325c-19d8-4e91-b668-636f3c267ad4}"
​...
}

Object.is(str, st1) 的调用也会返回false

【问题讨论】:

    标签: webrtc getusermedia mediastream


    【解决方案1】:

    您的问题答案的深层真相在于浏览器实现细节。 (意思是:尝试逆向工程应该从它是如何工作的,嗯,很困难。)

    如果您使用 WebRTC 的通信,则可以将相同的 stream 对象(从对 getUserMedia() 的单个调用)提供给多个对等连接对象,它们都会获得流数据。

    如果您愿意,可以将stream.clone() 转换为clone the stream。流克隆具有新的 id 值。

    就多次调用.getUserMedia() 而言,如果您在现有流的轨道上不执行track.stop() 就在某些浏览器情况下会失败。对不同的调用赋予不同的约束也会导致失败。

    【讨论】:

    • “如果您使用 WebRTC 的通信,您可以将同一个流对象(从一次对 getUserMedia() 的调用)提供给多个对等连接对象,它们都会获得流数据。”这就是我需要的最终或主要问题的答案。谢谢!我想对于我的用例,我只需要相同的流,有时需要相同的流以及来自另一个流的附加轨道。但是,对于我的问题,如果它是相同的流还是另一个流,我们仍然不这样做,尽管如果我引用的方式有效,这对我的用例并不重要,而只是为了了解真相。规范有何建议?
    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多