gpt4 book ai didi

javascript - getUserMedia() 返回后可以立即使用 MediaStream 吗?

转载 作者:行者123 更新时间:2023-12-01 02:51:30 27 4
gpt4 key购买 nike

我正在尝试从网站用户的手机捕获音频,并将其传输到远程 RTCPeerConnection。

假设我有一个获取本地MediaStream的函数:

function getLocalAudioStream(): Promise<*> {
const devices = navigator.mediaDevices;
if (!devices) {
return Promise.reject(new Error('[webrtc] Audio is not supported'));
} else {
return devices
.getUserMedia({
audio: true,
video: false,
})
.then(function(stream) {
return stream;
});
}
}

下面的代码工作正常:

// variable is in 'global' scope
var LOCAL_STREAM: any = null;
// At application startup:
getLocalAudioStream().then(function(stream) {
LOCAL_STREAM = stream;
});
...
// Later, when the peer connection has been established:
// `pc` is an RTCPeerConnection
LOCAL_STREAM.getTracks().forEach(function(track) {
pc.addTrack(track, LOCAL_STREAM);
});

但是,我不想保持 MediaStream 打开,并且我想稍后延迟获取流,所以我尝试了以下方法:

getLocalAudioStream().then(function(localStream) {
localStream.getTracks().forEach(function(track) {
pc.addTrack(track, localStream);
});
});

这不起作用(另一端收不到声音。)我尝试保留全局变量,以防出现奇怪的范围/垃圾收集问题:

// variable is in 'global' scope
var LOCAL_STREAM: any = null;

getLocalAudioStream().then(function(localStream) {
LOCAL_STREAM = localStream;
localStream.getTracks().forEach(function(track) {
pc.addTrack(track, localStream);
});
});

我在这里缺少什么?

返回 getUserMedia promise 的那一刻和将其添加到 RTCPeerConnection 的那一刻之间是否有等待延迟?或者我可以等待特定事件吗?

-- 编辑--

正如 @kontrollanten 所建议的,我通过重置 RTCPeerConnection 的本地描述使其在 Chrome 下工作:

getLocalAudioStream().then(function(localStream) {
localStream.getTracks().forEach(function(track) {
pc.addTrack(track, localStream);
});

pc
.createOffer({
voiceActivityDetection: false,
})
.then(offer => {
return pc.setLocalDescription(offer);
})
});

但是:

  • 它不适用于 Firefox
  • 我一定还是做错了什么,因为当我想挂断电话时我停不下来:

我尝试停止:

  getLocalAudioStream().then(stream => {
stream.getTracks().forEach(track => {
track.stop();
});
});

最佳答案

不,没有这样的延迟。一旦您返回媒体,您就可以将其发送到 RTCPeerConnection。

在你的例子中

getLocalAudioStream().then(function(localStream) {
pc.addTrack(track, localStream);
});

尚不清楚stream是如何定义的。难道是未定义吗?

为什么你不能选择以下内容?

getLocalAudioStream()
.then(function (stream) {
stream
.getTracks()
.forEach(function(track) {
pc.addTrack(track, stream);
});
});

关于javascript - getUserMedia() 返回后可以立即使用 MediaStream 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46937245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com