我可以使用MediaDevices.getUserMedia()为一个webrtc流连接到多个音频输入设备吗?

问题描述 投票:0回答:1

我没有发现任何关于这个的支持 getUserMedia docs。如果我只能通过约束来请求一个音频设备,我想知道是否可以调用 getUserMedia 然后将结果的流合并成一个流,这样我就可以将它连接到一个单一的有声视频元素。

我的最终目标是建立一个由视频和2个音频输入设备组成的webrtc流。我已经有一个webrtc流的设置,视频和一个单一的音频输入设备的工作,我只是想合并在一个额外的音频流。我提到这一点的情况下,有一些选项,这在webrtc方面以及。

随着所有的说,如果有 组合流的解决方案,会不会有保持音频同步的顾虑?

先谢谢你

audio video-streaming webrtc web-audio-api getusermedia
1个回答
0
投票

你可以做的是请求音频1和视频1的mediaastream。然后是音频2的mediaastream。以流2的轨道与 let track = stream2.getTracks()[0] 并将此轨道添加到stream1与 stream1.addTrack(track). Stream1就包含了所有你需要的轨道。添加轨道功能


0
投票

含有多个音频或视频轨道的流并没有用,因为只有第一个轨道会被播放。然而,你可以传输两个流,并在不同的视频元素中播放它们。

如果你想混合音频,webaudio可以实现这一点。


0
投票

所以我最终创建了这个功能来完成流的合并。

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
}

结果发现客户端其实是想从多声道音频接口访问多个声道,所以我还得再挖点东西。我想无论如何都要把这段代码分享给大家,以防有人偶然看到这篇文章。

© www.soinside.com 2019 - 2024. All rights reserved.