【问题标题】:Detect when HTML5 audio stream breaks or pauses检测 HTML5 音频流何时中断或暂停
【发布时间】:2016-06-06 10:31:58
【问题描述】:

我正在尝试在 Cordova 应用程序上使用 HTML5 音频流式传输 Shoutcast URL。

我遇到的问题是:当音频流失去连接到 ShoutCast URL 时,似乎没有触发回调。在这个阶段,音频元素显示它正在播放音频,但是没有音频。

代码

Radio = {
    initialized: false,
    isBuffering: false,
    interrupted: false,
    isPlaying: false,
    media: null,
    trackName: '',
    url: 'shoutcast_url',
    initialize: function () {
        if (!this.media) {
            this.media = new Audio(this.url);

            this.media.preload = "none";

            this.media.onerror = function (e) {
                App.alert("Unable to connect to Radio");
                Radio.interrupt();
            };

            this.media.onwaiting = function (e) {
                Radio.set_buffering(true);
            };

            this.media.onplaying = function (e) {
                Radio.set_buffering(false);
            };
        }
    },
    set_buffering: function (value) {
    ...
    }

场景

  • 连接到互联网(例如,通过热点)并启动音频广播。
  • 断开热点与互联网的连接。

播放完缓冲的内容后,音频停止播放。但不会触发表明连接丢失的回调。

  • media.networkState2 (NETWORK_LOADING)
  • media.playbackRate1(以正常速率播放)
  • media.readyState4 (HAVE_ENOUGH_DATA)
  • media.preloadnone

我尝试的回调(连接丢失时没有触发)是:

  • onstalled
  • onreset
  • onsuspend
  • onerror
  • onprogress
  • onwaiting

问题 - 是否有一个音频回调会在由于缺少连接而无法播放音频时触发?

如果没有,有什么方法可以更新readyStatenetworkState?如果是这样,我可以设置一个计时器来检查这些值。

【问题讨论】:

  • 您能展示一下您是如何聆听这些事件的吗?例如,停滞的应该可以工作,如此处所述:developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
  • @RaymondCamden 将我当前的代码添加到问题中。我在initialize() 中添加了回调。
  • 那么您是否尝试过停滞不前? this.media.addEventListener("stalled", ...
  • 不,我没有添加事件监听器。我认为onstalled 的功能是一样的。无论如何,我会在尝试后更新问题。
  • @RaymondCamden this.media.addEventListener("stalled", .. 也不会触发。第一次播放媒体时它会触发,但当我断开 Internet 连接时它不会触发....

标签: javascript cordova streaming html5-audio shoutcast


【解决方案1】:

您确定失去连接确实是您想要的吗?音频可能会停止,并且您的连接实际上会丢失,而底层 TCP 连接实际上并未关闭。您可能有几个小时没有数据,实际上是死连接,但该 TCP 连接仍然处于活动状态。

相反,我建议查看播放时间。 (您的 onprogress 处理程序也很有效。)如果在您设置的超时(10 秒或适合您的情况的任何时间)后仍未增加,则清除音频播放器并尝试重新连接。

【讨论】:

  • 我想在没有播放音频时收到通知,无论是由于缓冲还是由于失去连接。 onwaiting 会在音频播放之前触发(因为 preload 没有)。
  • media.durationmedia.currentTime 都始终是 0,因为这是一个音频 URL。回调onprogress 也不会更新。
  • @brad 我对 TCP 连接有类似的问题。我不确定,但是当互联网出现故障时,它只发送 30 个请求(或 30 秒),然后它停止发送请求,但如果它在 30 个请求之前返回,它开始流式传输和音频播放没有问题。因此,即使互联网重新上线,它也不会播放音频。那可能是什么限制?这是我的问题stackoverflow.com/questions/67056630/…
【解决方案2】:

当使用 HTML5 音频播放受支持的音频流时,确定音频是否正在播放的最佳方法是收听事件 timeupdate

当 currentTime 属性指示的时间已更新时,会触发 timeupdate 事件。

该事件仅在播放音频时触发。如果由于任何原因音频停止,timeupdate 也不会触发。

但是,浏览器支持还不完善。

  • 在 Android 5.0 (Chrome 48) 上,timeupdate 永远不会触发,currentTime 也不会更新。
  • 在最新的桌面浏览器(Mozilla 45 和 Chrome 49)上,timeupdate 的功能与文档一致。

【讨论】:

  • 能否提供更多详细信息?我有一个使用“cordova-plugin-media”的 Cordova 应用程序,并且以下代码仅触发一次(当流开始时)。 audioStream.ontimeupdate = alert("timeupdate 触发");
  • @AndrewBucklin timeupdate 不会在 Lollipop 上触发(据我所知)
【解决方案3】:

您可以监听online 事件以重新启动流:

window.addEventListener('online', function() {
  audio.play();
});

【讨论】:

  • online 事件与音频流无关。
  • 在您布置的场景中,断开互联网后音频流停止播放。当互联网恢复在线时,将触发“在线”事件。
  • 只要设备连接到 Wi-Fi,offline 就不会触发; online 也不会。此问题适用于 WiFi 路由器与互联网之间失去连接的情况。
猜你喜欢
  • 2016-09-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2019-12-04
  • 2014-02-19
  • 2014-07-26
相关资源
最近更新 更多