You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

由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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:41:01