有没有全局的方法可以检测浏览器中音频何时正在播放或开始播放。
类似于以下思路:if(window.mediaPlaying()){...
而不需要将代码绑定到特定元素?
编辑:重要的是要能够检测任何音频,无论音频来自哪里。无论它来自iframe、视频、Web Audio API等。
有没有全局的方法可以检测浏览器中音频何时正在播放或开始播放。
类似于以下思路:if(window.mediaPlaying()){...
而不需要将代码绑定到特定元素?
编辑:重要的是要能够检测任何音频,无论音频来自哪里。无论它来自iframe、视频、Web Audio API等。
这个并不推荐使用,但它可以正常工作。
基本上我发现访问整个窗口音频的唯一方法是使用MediaDevices.getDisplayMedia()。
从那里可以将一个MediaStream输入到AnalyserNode中,然后可用于检查音频音量是否大于零。
仅适用于 Chrome 和可能的 Edge (仅在 Linux 上的 Chrome 80 中测试过)
JSFiddle上有包括<video>
、<audio>
和 YouTube等内容!
重要的代码片段(无法在工作片段中发布,因为片段 iframe 上有功能策略):
var audioCtx = new AudioContext();
var analyser = audioCtx.createAnalyser();
var bufferLength = analyser.fftSize;
var dataArray = new Float32Array(bufferLength);
window.isAudioPlaying = () => {
analyser.getFloatTimeDomainData(dataArray);
for (var i = 0; i < bufferLength; i++) {
if (dataArray[i] != 0) return true;
}
return false;
}
navigator.mediaDevices.getDisplayMedia({
video: true,
audio: true
})
.then(stream => {
if (stream.getAudioTracks().length > 0) {
var source = audioCtx.createMediaStreamSource(stream);
source.connect(analyser);
document.body.classList.add('ready');
} else {
console.log('Failed to get stream. Audio not shared or browser not supported');
}
}).catch(err => console.log("Unable to open capture: ", err));
我阅读了所有关于Web Audio API的MDN文档,但是我没有找到任何显示音频播放的window全局标志。但我找到了一个巧妙的方法,可以显示任何正在播放的音频,无论是iframe还是video,但是它与Web Audio API有关:
const allAudio = Array.from( document.querySelectorAll('audio') );
const allVideo = Array.from( document.querySelectorAll('video') );
const isPlaying = [...allAudio, ...allVideo].some(item => !item.paused);
现在,我们可以通过isPlaying
标志检测浏览器中是否正在播放音频或视频。
var aud = new Audio("https://file-examples.com/<path>/file_example_MP3_700KB.mp3"); aud.play();
然后 MP3 音轨开始播放。new Audio
创建了一个 <audio>
元素,但是运行 document.querySelectorAll('audio')
不会返回它,除非你也将其附加到 document
中的某个位置。但是,你可以在不这样做的情况下操作和播放它。如果我在之前的评论中使用了错误的术语,请原谅我。我还没有遇到过 "trustedTypes" 错误。 - Lovethenakedgun有一个playbackState
属性 (https://developer.mozilla.org/en-US/docs/Web/API/MediaSession/playbackState),但并非所有浏览器都支持。
if(navigator.mediaSession.playbackState === "playing"){...
contentWindow
(https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/contentWindow)和`frames`(https://developer.mozilla.org/en-US/docs/Web/API/Window/frames)。我还在https://stackoverflow.com/questions/43745161/stop-all-audio-inside-iframes-from-parent找到了一个相关的问题,可能会有所帮助。 - NinaW