由MediaStreamDestinationNode生成的AudioTrack在源轨道停止后未终止
关于AudioContext合并音频轨道后ended事件与轨道活跃性的问题
问题1:是否可以将源AudioTrack的ended事件冒泡到合并后的新音频轨道?
不行,MediaStreamDestinationNode生成的音频轨道是独立于源轨道的,它不会自动继承源轨道的ended事件触发逻辑。你需要手动监听所有源音频轨道的ended事件,当所有源都停止时,主动触发合并后轨道的停止操作。
你可以在现有代码基础上添加计数器实现:
// 初始化源轨道计数器,对应麦克风+系统音频两个源 let activeSourceTracks = 2; // 修改源轨道的ended事件处理逻辑 mediaStream_01.getAudioTracks()[0].onended = function () { console.log('mic audiostream ended'); checkAllSourcesStopped(); }; stream.getAudioTracks()[0].onended = function (){ console.log('screenshare audio stream ended'); checkAllSourcesStopped(); }; // 检查所有源轨道是否已停止的函数 function checkAllSourcesStopped() { activeSourceTracks--; if (activeSourceTracks === 0) { // 主动停止合并后的音频轨道 const mergedAudioTrack = newStream.getAudioTracks()[0]; mergedAudioTrack.stop(); console.log('merged audio tracks ended'); } }
问题2:为何所有源轨道停止后,MediaStreamDestinationNode的音频轨道仍保持活跃?
这是因为MediaStreamDestinationNode的输出轨道生命周期由它所属的AudioContext控制,而非绑定输入源的状态。只要AudioContext处于运行状态,即使所有输入源都停止传输音频数据,目标轨道也会持续生成静音的音频帧,不会主动触发ended事件,直到你主动调用轨道的stop()方法,或者关闭对应的AudioContext。
内容的提问来源于stack exchange,提问作者Kyung Neung Lee
相关产品推荐
相关产品推荐

