【问题标题】:How to determine if playing HTML5 audio is actually making sound?如何确定播放 HTML5 音频是否真的发出声音?
【发布时间】:2016-01-18 11:14:57
【问题描述】:

出于我正在工作的项目的目的,我想通过 JS 控制台了解在 facebook.com 上找到的

您可以通过键入以下内容找到该元素:

$$("audio")[0] 

我使用以下代码(改编自我在搜索过程中找到的this jsfiddle)来显示何时调用不同的事件侦听器:

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].play();

如果我检查 $$("audio")[0].paused,它会显示 false,但我没有找到任何属性或事件可以表明它是否播放声音。 (我不希望它出现在这里,因为我认为它没有要播放的音频数据,但如果有办法检查,我可以将其与播放声音的音频元素进行比较。)

另外,我曾尝试通过隐身标签向自己发送一条消息,但没有看到发生这种情况的痕迹。 (我假设音频元素被用于此。)

感谢您的帮助。

【问题讨论】:

  • 这有点不清楚你问的是什么。你只想知道它是否真的在玩吗?如果是这样,您只需检查其paused 属性。 (if(!yourAudio.paused)console.log('isPlaying')) 和there are dupes。否则,请澄清您的问题。
  • 我以为我很清楚,但如果有更好的表达方式,我会很乐意进行编辑。我想知道它是否正在播放声音或曾经播放过声音(即我真的听到了什么吗?)。我认为这个陈述与我的问题最相关:“如果我检查 $$("audio")[0].paused,它将显示为 false,但我没有找到任何表明它是否播放的属性或事件声音与否。”
  • “播放的声音”是什么意思?是否要检查加载的媒体是否没有声音? (困难但可行)您要检查它是否已静音? (很容易检查)你想检查它是否至少已经播放过一次,无论它现在是什么状态? (简单)
  • Ps : 在查看您的个人资料页面后,您必须知道您将无法将网页上的所有声音静音:如果它来自闪存,您会卡住,如果音频元素没有附加到 DOM 也不能通过全局范围访问,你被外部 iframe 卡住了,你被卡住了,可能还有其他原因导致这不可能。
  • 我现在看到您编辑的评论,这个 IMO 的最佳解决方案是检查将返回 TimeRange 的 audioElement.played 属性。然后您可以检查此 TimeRange 的长度以了解它是否至少播放过一次 (if(audioElement.played.length&gt;0){// has been played})

标签: javascript html google-chrome audio


【解决方案1】:

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

这将返回一个TimeRanges 对象,您也可以使用它来获取已播放的媒体量。

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

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

【讨论】:

  • 不过,我并没有问它是否播放过;我想知道它是否发出声音。对于 HTML5 音频,我认为这种方法有效,因为如果有时间范围,那么就会有一些数据可以播放。对于 HTML5 视频,我不太相信(我们知道有一些视频,但我们不知道它是否也有声音)。但它似乎适用于我检查的第一个示例:www.youtube.com/;现在将检查其他一些测试用例)。
  • 您的回答很好,我马上接受。这里实际上存在三种不同的场景:从未播放过的 HTML5 音频、从未播放过的 HTML 视频和播放过但没有音频的 HTML5 视频。您的答案是针对这三个场景中的前两个场景的解决方案,这确实是我最关心和最关心的问题。谢谢!
  • 对于第三种情况,您必须创建一个新的AudioContext().createMediaElementSource(yourVideoElement),然后将其附加到ScriptProcessorNode,并在播放时检查是否从该源输出了一些值。或者 Firefox 有一个 videoElement.mozHasAudio 属性。但我认为没有音轨的视频非常少见,所以你可以接受这个误差范围,但是,因为音频输出是你的主要兴趣,那么你还应该仔细检查mutedvolume mediaElement 的属性
  • 我已经在看静音了。我正在考虑的用例是藤蔓、由动画 gif 生成的视频和无声的 html5 广告。你的 mozHasAudio 很有帮助(搜索它发现 stackoverflow.com/questions/21270048/…)。具体来说,检查 webkitAudioDecodedByteCount 属性。
  • Vine 使用多个视频元素,并且只对来自动画 gif 的视频的原始元素 (document.querySelectorAll('video')[1]) 静音,我只看到这些非标准浏览器相关属性-可能-将在任何未来版本中删除和过重的AudioContext-hacky-workaround
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2012-07-27
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多