【问题标题】:Reproduce audio files one after another一个接一个地再现音频文件
【发布时间】:2012-01-05 16:31:51
【问题描述】:

我正在使用 HTML5 音频标签一个接一个地播放音频文件,但我的例程似乎使 Firefox 崩溃。它仅在我添加 alert() 时有效。

我在 PHP 中有一个例程,它每 2 秒检查一次是否有另一个应用程序向服务器发送了新事件,如果是,我在屏幕上写下新事件的名称。其中一些事件具有与之相关的音频文件(它们可以是不同的声音),因此当事件到达时,必须播放音频文件。

我有这个习惯:

当事件到达时,我调用这个函数:playSound(sound_name);

    function playSound(sound_name){
        if (!current_sound){
            current_sound = true;
            $("#audio-player")[0].src = "../snd/"+sound_name;
            //$("#audio-player")[0].load();
            $("#audio-player")[0].play();
        }
        else {
            //alert(sound_name);
            playSound(sound_name);
        }
    }

当 audio_player 触发音频标签的“结束”事件时,变量“current_sound”设置为 false。我为这个事件附加了一个函数,所以每次触发它时都会将变量 current_sound 设置为 false。

所有这些代码的问题在于它只适用于函数 playSound() 中的警报。如果我评论它,Firefox 会崩溃并开始说 js 脚本需要很长时间才能完成(他们的 js 脚本之一,不是我的)。

我搜索了很多,但我只找到了有关如何重现给定文件列表的示例,这在我的情况下没有用,因为我不知道会预先播放哪些文件。

有什么建议吗?

【问题讨论】:

  • 这个问题的整个“audio”元素(和HTML5元素)可以被提取出来,这可以变成一个实际的Javascript问题。

标签: jquery html firefox audio


【解决方案1】:

你有一个微不足道的递归调用。 alert 只是增加了延迟并“中断”了该执行链,从而允许其他地方的线程在边缘获得消息。大概您在其他地方有代码将current_sound 设置为false

不要尝试像这样“等待”,而是使用回调函数 - 无论您在做什么current_sound = false,而是执行.play() 的东西。

【讨论】:

    【解决方案2】:

    第一次调用后,current_sound 将设置为 true。这将导致每次都采用 else 分支,从而再次调用该函数。这会导致无限递归。

    【讨论】:

    • @Lightness Races in Orbit 谢谢。我知道我应该在我将 current_sound 设置为 false 的函数中的 playSound() 函数中执行我所做的事情(这是触发“结束”事件时的回调函数)。但是,如果我有 5 个事件等待它们的声音播放,会发生什么?那是我不明白如何告诉回调函数接下来是哪个声音的部分。
    • @user1132585: $("#audio-player")[0] 是下一个。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多