【发布时间】:2017-10-25 16:09:14
【问题描述】:
我正在尝试从网站用户的手机中捕获音频,并将其传输到远程 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 承诺返回的那一刻和它可以添加到 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();
});
});
【问题讨论】:
标签: javascript webrtc