【问题标题】:How can I detect whether my audio stream is: playing, paused or finished?如何检测我的音频流是否:正在播放、暂停或完成?
【发布时间】:2016-09-01 14:34:27
【问题描述】:

我正在开发一个在线广播网站,并试图检测音频播放器当前对用户的状态。

我当前的设置在知道这一点时通常是错误的,如果我在 iOS 上并且我从锁屏播放器暂停,它仍然会认为它正在播放,因为我从未点击过 html 暂停按钮。

最后,如何检测我的流何时完全结束。我试过:onstalled=""onwaiting=""onerror=""onended=""。但它们都不是 100% 工作的。最接近工作的是:onstalled="",但即使这样也只有 60% 左右的成功率(有时当我加载网站时它会告诉我它已经结束)。

HTML:

<audio autoplay="" id="player" title="" oncanplay="radioLoaded()">
    <source src="...">
</audio>

Javascript:

function radioLoaded() {
    if (player.paused) {
        document.getElementById('radioplaypause').innerHTML = varRadioResume;
    } else if (player.play) {
        document.getElementById('radioplaypause').innerHTML = varRadioPause;
    } else {
        document.getElementById('radioplaypause').innerHTML = varRadioLoading;
    }

    window.player = document.getElementById('player');
    document.getElementById('radioplaypause').onclick = function () {
        if (player.paused) {
            player.play();
            this.innerHTML = varRadioPause;
        } else {
            player.pause();
            this.innerHTML = varRadioResume;
        }
    }
};

function radioEnded() { 
    document.getElementById('radiolivetext').innerHTML = 'OFFLINE';
    document.getElementById('radioplayer').style.display = 'none';
    document.getElementById('radioinformation').style.display = 'none';
};

【问题讨论】:

  • 你能澄清一下你所说的“结束”是什么意思吗?当音频由于连接速度慢或用户单击“暂停/停止”按钮或其他东西而正在缓冲时,它只是随机停止吗?
  • 当我的收音机在晚上结束时。当我不再向网站发送/上传数据时。

标签: javascript html html5-audio audio-streaming


【解决方案1】:

试试这个,一般对代码进行一些更正/注释:

function radioLoaded() {

    // move this line to the top
    window.player = document.getElementById('player'); // !!! <-- name too generic, possibility of global collisions

    var playPauseButton = document.getElementById('radioplaypause');

    if (player.paused) {
        playPauseButton.innerHTML = varRadioResume;
    } else if (player.play) {
        playPauseButton.innerHTML = varRadioPause;
    } else {
        playPauseButton.innerHTML = varRadioLoading;
    }

    playPauseButton.onclick = function () {
        if (player.paused) {
            player.play();
            this.innerHTML = varRadioPause;
        } else {
            player.pause();
            this.innerHTML = varRadioResume;
        }
    };

    player.onended = function () {
        console.log('ended');
    };

    // other helpful events
    player.onpause = function () {
       console.log('paused...');
    }

    player.onplay = function () {
       console.log('playing...');
    }

    player.onprogress = function (e) {
       console.log(e.loaded + ' of ' + e.total + ' loaded');
    }
};

【讨论】:

  • onended 仅在文件自行到达末尾时触发,您正在谈论 onpause 事件。对于进度,您必须使用ifs 设置一些计时器来跟踪它。
  • 是的,onended 似乎不起作用。实现流已停止的下一个最佳方法是什么?因为我认为它永远不会“结束”:(
  • 我相信广播会涉及流媒体,让我看看是否有任何事件可以解释这一点。
  • 你认为只发布一个单独的问题会更好吗,因为我找不到很多有用的答案
  • 为什么不,你可以。你也可以先google stackoverflow
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2014-06-10
  • 2016-06-06
  • 2022-12-11
  • 2013-07-03
相关资源
最近更新 更多