Javascript 如何确定播放HTML5音频是否真的发出声音?

Javascript 如何确定播放HTML5音频是否真的发出声音?,javascript,html,google-chrome,audio,Javascript,Html,Google Chrome,Audio,对于我正在工作的一个项目,我想通过JS控制台了解我在搜索过程中找到的事件是否可以显示何时调用不同的事件侦听器: var audio = $$("audio")[0]; var events = 'abort,canplay,canplaythrough,durationchange,emptied,ended,error,loadeddata,loadedmetadata,loadstart,pause,play,playing,progress,ratechange,seeked,seeki

对于我正在工作的一个项目,我想通过JS控制台了解我在搜索过程中找到的事件是否可以显示何时调用不同的事件侦听器:

var audio = $$("audio")[0]; 
var events = 'abort,canplay,canplaythrough,durationchange,emptied,ended,error,loadeddata,loadedmetadata,loadstart,pause,play,playing,progress,ratechange,seeked,seeking,stalled,suspend,timeupdate,volumechange,waiting'.split(',');

// event handler
var onEvent = function(e) {
    console.log(e.type);
};

// add event listener to audio for all events
for (var i = 0, len = events.length; i < len; i++) {
    audio.addEventListener(events[i], onEvent, false);
}
如果我选中$$(“audio”)[0]。已暂停,它将显示false,但我没有找到任何属性或事件来指示它是否播放声音。(我不希望它出现在这里,因为我认为它没有音频数据可以播放,但如果有办法检查的话,我可以将其与播放声音的音频元素进行比较。)

另外,我试着从一个匿名标签上给自己发了一条信息,但没有看到发生这种情况的痕迹。(我假设音频元素用于此目的。)


感谢您的帮助。

要检查页面上是否播放过
HTMLMEDIALEMENT
(视频或音频),最好的解决方案是检查其
播放属性

这将返回一个对象,您也可以使用该对象获取播放了多少媒体

如果从未播放过,则此
TimeRanges
对象的
length
属性将设置为
0

if(audioElement.played.length){
  // This media has already been played
}else{
  // Never
}

你问什么有点不清楚。你只想知道它是否真的在播放吗?如果是这样,您只需检查它的
paused
属性。(
如果(!yourAudio.paused)console.log('isPlaying')
)和。否则,请澄清您的问题。我认为我很清楚,但如果有更好的表达方式,我将很乐意进行编辑。我想知道它是在播放声音还是曾经播放过声音(即,我真的听到了什么吗?)。我认为这句话与我的问题最相关:“如果我选中$$(“audio”)[0]。暂停,它将显示false,但我没有找到任何属性或事件来指示它是否播放声音。“播放的声音”是什么意思?”?是否要检查加载的媒体中是否没有声音?(困难但可行)是否要检查它是否静音?(易于检查)您想检查它是否至少已经播放过一次,无论它现在的状态如何?(简单)Ps:查看个人资料页面后,你必须知道你无法将网页中的所有声音静音:如果声音来自flash,你会被卡住,如果音频元素没有附加到DOM,也没有通过全局范围访问,你会被外部iframe卡住,你会被卡住,这可能还有其他原因。我现在看到了您编辑的评论,这个IMO的最佳解决方案是检查
audioElement.played
属性,该属性将返回一个时间范围。然后,您可以检查此时间范围的长度,以了解它是否至少播放过一次(
if(audioElement.played.length>0){//haves played}
),但我并不是问它是否曾经播放过;我想知道它是否发出过声音。对于HTML5音频,我认为这种方法是有效的,因为如果有一个时间范围,那么就有一些数据可以播放。对于HTML5视频,我不太相信(我们知道有一些视频,但我们不知道它是否有声音)。但这似乎适用于我检查的第一个例子:www.youtube.com/;你的答案很好,我马上就接受。这里实际上有三种不同的场景:从未播放过的HTML5音频,从未播放过的HTML视频,以及播放过但没有音频的HTML5视频。您的答案是这三种情况中前两种的解决方案,这正是我所问的,也是我最关心的。谢谢对于第三个场景,您必须创建一个新的
AudioContext().createMediaElementSource(yourVideoElement)
,然后将其附加到
ScriptProcessorNode
并检查播放时是否从该源输出了一些值。或者firefox有一个
videoElement.mozasAudio
属性。但是我认为没有音轨的视频非常少见,所以你可以接受这个误差,但是,既然音频输出是你的主要兴趣,那么你也应该仔细检查媒体元素的
静音
音量
属性我已经在看静音了。我想到的用例是藤蔓、动画GIF制作的视频和无声html5广告。您的MozasAudio很有帮助(搜索它)。具体地说,检查webkitAudioDecodedByteCount属性。Vine使用多个视频元素,并对来自动画gif的视频仅禁用原始元素(
document.queryselectoral('video')[1]
),我只看到这些非标准的浏览器相关属性,这些属性可能会在未来的任何版本和过度繁重的AudioContext黑客解决方案中被删除
$$("audio")[0].play();
if(audioElement.played.length){
  // This media has already been played
}else{
  // Never
}