从 js/jquery 中的对象数组播放音频文件

Posted

技术标签:

【中文标题】从 js/jquery 中的对象数组播放音频文件【英文标题】:Playing audio files from object array in js/jquery 【发布时间】:2013-12-21 14:22:32 【问题描述】:

我正在制作一个对象来围绕 html5 音频元素的实例包装控件。为了测试,我做了一个这样的对象(为了便于阅读而简化)..

function AudioObject(audio) 
    var innerAudio = audio;

    this.Play = function () 
        innerAudio.play()
    

我有一个包含此 AudioObject 实例的数组。

var AudioObjects = [];

然后,当创建新的 AudioObjects 时,我将它们添加到数组中。我有一个函数可以延迟播放 AudioObjects,以便它们按顺序播放。像这样的:

var audioObj = new AudioObject(audio);
AudioObjects.push(audioObj);
....
....
var delay = 0;
$.each(AudioObjects, function(iterator, obj) 
    setTimeout(obj.Play, delay);
    delay = delay + 3000;

当只有一个音频文件时,它可以正常播放,但是一旦我添加了更多 AudioObjects,数组中的每个文件都会将它们的 innerAudio 变量设置为最新创建的 Audio 元素。我可以从 html 中单独播放每一个。我在创建时进行了调试,我可以看到它正在设置正确的音频,但是在被推送到数组后,数组中的对象都被切换到了最新的 innerAudio。

我没有正确实例化我的对象吗?我制作了this jsfiddle 来试验警报文本,它似乎没有我遇到的问题。

更新:我想我找到了我的问题。这就是我认为您在对象内部编写“公共”和“私有”函数的方式。

function Thing(test) 
    var thingTest = test;

    // Public function
    this.PublicTest = function () 
        setTimeout(Test, 1000);
    

    // Private function
    PrivateTest = function () 
       alert(thingTest);
    

这基本上是我的代码的结构方式,但是“私有”函数的范围与公共函数的范围不同。我仔细检查了我的数组,它实际上是用正确的音频源保存了正确的音频对象,但是在运行调用“私有”函数的函数时,它调用了错误的音频文件。

我已更新 the jsfiddle 以显示正在发生的事情。我以为它会提醒“test1”然后是“test2”,但它会提醒“test2”两次。

更新 2:为了记录,将私有函数更改为此修复了问题:

function Play()    // <<< That's all I had to change!
    innerAudio.play()

【问题讨论】:

【参考方案1】:

您是否为每个音频包装器创建唯一的音频对象?

var audio = new Audio();
audio.src = 'src';

var audioObj = new AudioObject(audio);
AudioObjects.push(audioObj);

【讨论】:

我很确定我是。这是制作新 AudioObject.. var recObj = new AudioObject(0, audio.duration, audio);在创建对象时,“音频”指的是与我的 AudioObjects 数组中的 AudioObject 不同的 src。一旦我推送了这个新对象,数组中的对象就会发生变化。 啊!我发现了我的问题!!我正在更新我原来的帖子。

以上是关于从 js/jquery 中的对象数组播放音频文件的主要内容,如果未能解决你的问题,请参考以下文章

从 sqlite 数据库 Objective-C 播放音频文件

PyDub 从变量播放音频

如何在 Xcode11 中的 Swift 中随机播放数组中的音频文件?

使用Javascript播放数组序列音频文件[重复]

从 Struct 创建的数组中存储的选定表格单元格中播放音频

AVAudioPlayer 使用数组对音频文件进行排队 - Swift