HTML5 检查音频是不是正在播放?

Posted

技术标签:

【中文标题】HTML5 检查音频是不是正在播放?【英文标题】:HTML5 check if audio is playing?HTML5 检查音频是否正在播放? 【发布时间】:2012-02-24 20:00:57 【问题描述】:

用于检查 html5 音频元素当前是否正在播放的 javascript api 是什么?

【问题讨论】:

查看相关:***.com/questions/6877403/… 【参考方案1】:
function isPlaying(audelem)  return !audelem.paused; 

音频标签有一个paused 属性。如果它没有暂停,那么它正在播放。

【讨论】:

这是错误的答案。我只是在使用它,在第一次启动之前 .paused 是错误的。 @Tom 你有一个 jsbin 吗?我试过了,这似乎是正确的答案。 @Harry 我玩得更多,似乎在某些浏览器中它确实有效,而有些则无效。我想这取决于实施。但是对于 chrome 和 firefox 的所有最新更新,它似乎都可以工作,所以这个答案对于最新的实现是正确的。 监听事件! addEventListener('playing', func) 和 addEventListener('pause', func)。 根据HTML Living Standard 和W3C HTML5 spec,“paused 属性表示媒体元素是否暂停。该属性最初必须为真”。也许@Harry 和@Tomas 在 2012 年发现情况并非如此,因为当时的规格还不清楚。但是......我在规范中找不到任何内容(并不是说它不存在!)说播放结束时“暂停”属性必须为真。有意见吗?【参考方案2】:

您可以查看持续时间。如果持续时间超过 0 秒,则它正在播放并且没有暂停。

var myAudio = document.getElementById('myAudioID');

if (myAudio.duration > 0 && !myAudio.paused) 

    //Its playing...do your job

 else 

    //Not playing...maybe paused, stopped or never played.


【讨论】:

我个人认为!myAudio.paused||!myAudio.currentTime 会做得更好。 @m93a 你不是说!myAudio.paused || myAudio.currentTime 吗? 是的,应该是!myAudio.paused || myAudio.currentTime。似乎从来没有回复过......【参考方案3】:

虽然我对这个线程真的很晚了,但我使用这个实现来确定声音是否正在播放:

service.currentAudio = new Audio();

var isPlaying = function () 
    return service.currentAudio
        && service.currentAudio.currentTime > 0
        && !service.currentAudio.paused
        && !service.currentAudio.ended
        && service.currentAudio.readyState > 2;

我认为音频元素上的大多数标志都是显而易见的,除了您可以在此处阅读的就绪状态:MDN HTMLMediaElement.readyState。

【讨论】:

如果音频在锁定时被 ios 自动暂停,则不起作用。【参考方案4】:
document.getElementsByTagName('audio').addEventListener('playing',function()  myfunction(); ,false); 

应该做的伎俩。

【讨论】:

getElementsByTagName('audio')[0] 因为它返回集合,而不是一个元素【参考方案5】:

试试这个功能! 如果位置是开头或结尾,则不会执行音频播放

function togglePause() 
     if (myAudio.paused && myAudio.currentTime > 0 && !myAudio.ended) 
         myAudio.play();
      else 
         myAudio.pause();
     

【讨论】:

【参考方案6】:

我想知道这段代码是否可以工作,结果令人惊讶的是:

if (a.paused == false) 
/*do something*/

或者你可以写成:

if (!a.paused == true) 
/*do something*/

如果你想让你的 IDE 在 JSfiddle 中惹恼你。

【讨论】:

也许你也可以用“正在运行”替换“暂停”,它仍然可以工作 或者您可以省略“== true”部分,您的 IDE 不会打扰您。【参考方案7】:

你可以使用onplay事件。

var audio = document.querySelector('audio');
audio.onplay = function()  /* do something */;

var audio = document.querySelector('audio');
audio.addEventListener('play', function()  /* do something */ ;

【讨论】:

第二种方法似乎效果最好。 Firefox,Linux Mint,在页脚脚本中。【参考方案8】:

试用此代码:

    var myAudio = document.getElementById("audioFile"); 

    function playAudio()  
          //audio.play(); 
          //console.log(audio.play())
           if (myAudio.paused && myAudio.currentTime >= 0 && !myAudio.started) 
         myAudio.play();
         console.log("started");
      else 
         myAudio.pause();
     

【讨论】:

您好,欢迎来到 SO!虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。请阅读tour和How do I write a good answer?【参考方案9】:

要检查音频是否真的开始播放,特别是如果你有一个流,需要检查audio.played.length1。只有当音频是真正的开始声音时,它才会为 1。否则将是0。它更像是一种 hack,但即使在 Safari 和 Chrome 等移动浏览器中仍然有效。

【讨论】:

【参考方案10】:

我是这样做的

    <button id="play">Play Sound</button>
<script>
    var sound = new Audio("path_to_sound.mp3")
    sound.loop = false;
    var play = document.getElementById("play")
    play.addEventListener("click", () => 
        if (!isPlaying()) 
            sound.play()
         else 
            //sound.pause()  
        
    )

    function isPlaying() 
        var infoPlaying = false
        var currentTime = sound.currentTime == 0 ? true : false
        var paused = sound.paused ? true : false
        var ended = !sound.ended ? true : false
        var readyState = sound.readyState == 0 ? true : false
        if (currentTime && paused && ended && readyState) 
            infoPlaying = true
         else if (!currentTime && !paused && ended && !readyState) 
            infoPlaying = true
        
      return infoPlaying
    
</script>

【讨论】:

【参考方案11】:

我正在使用这个带有拖曳按钮播放和停止的 jquery 代码,播放按钮是一个播放和暂停按钮

const help_p = new Audio("audio/help.mp3");//Set Help Audio Name
$('#help_play').click(function() //pause-Play
if (help_p.paused == false) 
  help_p.pause();//pause if playing
 else 
  help_p.play();//Play If Pausing

);

$('#help_stop').click(function() //Stop Button
  help_p.pause();//pause
  help_p.currentTime = 0; //Set Time 0
);

【讨论】:

【参考方案12】:

虽然没有称为 isPlaying 或类似的方法,但有几种方法可以完成此操作。

此方法在播放音频时获取进度百分比:

function getPercentProg() 
    var myVideo = document.getElementById('myVideo');
    var endBuf = myVideo.buffered.end(0);
    var soFar = parseInt((endBuf / myVideo.duration) * 100);
    document.getElementById('loadStatus').innerHTML =  soFar + '%';

如果百分比大于 0 小于 100,则播放,否则停止。

【讨论】:

呃,如果我在中间暂停音频呢? 那么它就不会播放了。 这只检测缓冲的数量。例如,如果音频元素已开始缓冲数据但由于数据不足而尚未开始播放,则此方法仍然可以返回 true。或者,如果元素在播放过程中缓冲了数据并随后被暂停。 getElementsByTagName('myVideo') ?我认为应该是 getElementById('myVideo') Em... 为什么要减去?好主意,虽然写得不好。如何检查实时音频 (WebRTC) 是否正在播放 .paused?仅使用缓冲区检查。不值得减去。我赞成。

以上是关于HTML5 检查音频是不是正在播放?的主要内容,如果未能解决你的问题,请参考以下文章

检查是不是正在播放 HTML5 视频元素

如何检查音频队列中的音乐是不是正在播放或暂停

ios nstimer 在后台运行以检查警报时间是不是等于当前时间并播放音频

检查哪些程序正在播放音频?

如何检查音乐是不是正在从哪个音乐应用程序播放?

HTML5 音频:设置 currentTime 然后在 iPhone 上播放自发倒带 50-100 毫秒