我可以使用 MediaDevices.getUserMedia() 为 webrtc 流连接到多个音频输入设备吗?
Can I connect to multiple audio input devices using MediaDevices.getUserMedia() for a webrtc stream?
我没有在 getUserMedia
文档中找到对此的任何支持。如果我只能通过约束请求一个音频设备,我想知道是否可以为第二个音频设备再次调用 getUserMedia
,然后 merge/combine 将结果流合并为一个,以便我可以将它附加到单个 audio/video 元素。
我的最终目标是建立一个由视频和 2 个音频输入设备组成的 webrtc 流。我已经有一个带有视频和单个音频输入设备的 webrtc 流设置,我只是想合并到一个额外的音频流中。我提到这一点是为了防止在 webrtc 方面也有一些选项。
综上所述,如果有合并流的解决方案,是否会担心保持音频同步?
提前致谢!
你可以做的是请求音频1和视频1的媒体流。然后是audio2的媒体流。使用 let track = stream2.getTracks()[0]
获取 stream2 的曲目,然后使用 stream1.addTrack(track)
将此曲目添加到 stream1。然后 Stream1 包含您需要的所有曲目。 addTrack function
具有多个音频 and/or 视频轨道的流没有用处,因为只会播放第一轨道。但是,您可以传输两个流并在单独的视频元素中播放它们。
如果您想混合音频,webaudio 可以实现。
所以我最终创建了这个函数来完成流合并:
function createMergedStream(...streams: MediaStream[]): MediaStream {
const audioContext = new AudioContext()
const audioSources: MediaStreamAudioSourceNode[] = []
const videoTracks: MediaStreamTrack[] = []
streams.forEach((stream) => {
stream.getTracks().forEach((track) => {
if (track.kind === "video") {
videoTracks.push(track)
}
})
audioSources.push(audioContext.createMediaStreamSource(stream))
})
const destination = audioContext["createMediaStreamDestination"]()
audioSources.forEach((audioSource) => {
audioSource.connect(destination)
})
videoTracks.forEach((track) => {
destination.stream.addTrack(track)
})
return destination.stream
}
原来客户实际上是想从多通道音频接口访问多个通道,所以我还有更多的挖掘工作要做。我想无论如何我都会分享这段代码,以防有人偶然发现这个 post.
我没有在 getUserMedia
文档中找到对此的任何支持。如果我只能通过约束请求一个音频设备,我想知道是否可以为第二个音频设备再次调用 getUserMedia
,然后 merge/combine 将结果流合并为一个,以便我可以将它附加到单个 audio/video 元素。
我的最终目标是建立一个由视频和 2 个音频输入设备组成的 webrtc 流。我已经有一个带有视频和单个音频输入设备的 webrtc 流设置,我只是想合并到一个额外的音频流中。我提到这一点是为了防止在 webrtc 方面也有一些选项。
综上所述,如果有合并流的解决方案,是否会担心保持音频同步?
提前致谢!
你可以做的是请求音频1和视频1的媒体流。然后是audio2的媒体流。使用 let track = stream2.getTracks()[0]
获取 stream2 的曲目,然后使用 stream1.addTrack(track)
将此曲目添加到 stream1。然后 Stream1 包含您需要的所有曲目。 addTrack function
具有多个音频 and/or 视频轨道的流没有用处,因为只会播放第一轨道。但是,您可以传输两个流并在单独的视频元素中播放它们。
如果您想混合音频,webaudio 可以实现。
所以我最终创建了这个函数来完成流合并:
function createMergedStream(...streams: MediaStream[]): MediaStream {
const audioContext = new AudioContext()
const audioSources: MediaStreamAudioSourceNode[] = []
const videoTracks: MediaStreamTrack[] = []
streams.forEach((stream) => {
stream.getTracks().forEach((track) => {
if (track.kind === "video") {
videoTracks.push(track)
}
})
audioSources.push(audioContext.createMediaStreamSource(stream))
})
const destination = audioContext["createMediaStreamDestination"]()
audioSources.forEach((audioSource) => {
audioSource.connect(destination)
})
videoTracks.forEach((track) => {
destination.stream.addTrack(track)
})
return destination.stream
}
原来客户实际上是想从多通道音频接口访问多个通道,所以我还有更多的挖掘工作要做。我想无论如何我都会分享这段代码,以防有人偶然发现这个 post.