Javascript:<audio>.captureStream() 是否可以在没有 play() 的情况下工作?

标签 javascript webrtc html5-audio

在浏览器中,我想捕获以 .mp3 作为源的音频标签流,然后通过 WebRTC 将其实时发送到服务器。我不想通过扬声器听到它。

是否可以在没有扬声器输出的情况下调用 audioElement.play()?

最佳答案

new Audio() 返回 HTMLAudioElement连接到浏览器的默认音频输出设备。您可以通过运行以下命令在开发控制台中验证这一点:

> new Audio().sinkId
<- ""

其中空字符串输出指定 user agent default sinkId .

一种将 HTMLAudioElement 实例的输出连接到非默认接收器的灵活方式(例如,如果您不想通过扬声器听到它,而只是想将它发送到另一个destination like a WebRTC peer connection ), 是使用全局 AudioContext反对create a new MediaStreamAudioDestinationNode .然后你可以捕获MediaElementAudioSourceNode通过 audioContext.createMediaElementSource(mp3Audio) 从保存 mp3 文件的 Audio 对象,并将其连接到新的音频目标节点。然后,当您运行 mp3Audio.play() 时,它将仅流式传输到目标节点,而不是默认(扬声器)音频输出。

完整示例:

// Set up the audio node source and destination...
const mp3FilePath = 'testAudioSample.mp3'
const mp3Audio = new Audio(mp3FilePath)
const audioContext = new AudioContext()
const mp3AudioSource = audioContext.createMediaElementSource(mp3Audio)
const mp3AudioDestination = audioContext.createMediaStreamDestination()
mp3AudioSource.connect(mp3AudioDestination)

// Connect the destination track to whatever you want,
// e.g. another audio node, or an RTCPeerConnection.
const mp3AudioTrack = mp3AudioDestination.stream.getAudioTracks()[0]
const pc = new RTCPeerConnection()
pc.addTrack(track)

// Prepare the `Audio` instance playback however you'd like.
// For example, loop it:
mp3Audio.loop = true

// Start streaming the mp3 audio to the new destination sink!
await mp3Audio.play()

关于Javascript:<audio>.captureStream() 是否可以在没有 play() 的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52615827/

相关文章:

angularjs - 通过 $http 服务使用 AngularJs 的 HTML5 音频播放器

webrtc - 用于无音频和视频的 native 应用程序的最小 WebRTC

webrtc - WebRTC:自Firefox v 53起,ICE失败

javascript - 令人困惑的绑定(bind)。如何将一个对象绑定(bind)到另一个对象?

javascript - 更改相对于旧行高值的行高属性

javascript - MediaRecorder 无故改变大小

javascript - 如何突出显示 Amazon Polly 中的音频播放词

javascript - 如何使用javascript网络音频扭曲特定的频率范围?

javascript - 当 src 更改时如何强制重新创建 <img/>?

javascript - 无法解析模块说明符 "vee-validate"。相对引用必须以 "/"、 "./"或 "../"开头