我可以通过Titanium.Media.Sound对象成功播放远程mp3,但是有一个问题。第一个剪辑总是很好。但每次我尝试播放不同的剪辑时,第一个剪辑再次播放。这是100%可重复的。
所以在我的js文件的顶部我正在这样做:
var soundPlayer = Ti.Media.createSound({allowBackground: false});
然后在事件监听器中单击按钮,我正在设置URL:
soundPlayer.setUrl(mp3URL);
我甚至尝试过这种方法:
soundPlayer.url = mp3URL;
但它们都有相同的缺陷:音频始终是第一个剪辑,从来没有我设置的任何剪辑。我已经通过控制台记录验证了实际上一个新的URL被传递给了声音播放器,实际上新的url指向一个有效的mp3。看起来,一旦我为声音播放器设置了一个网址,它就会被设置为无法更改 - 只需重播即可。
然后我尝试了一种完全不同的方法。在我的按钮单击侦听器中,我每次都重新创建Sound对象并传递新的URL:
soundPlayer = Ti.Media.createSound({allowBackground: false, url: mp3URL});
这实际上每次都会起作用并播放新的网址,但它有一个可怕的副作用:任何附加的事件监听器都不再开火。我需要跟踪播放器中的状态变化,例如当它完成时等等。但是当我采用这种方法时,这些事件监听器不再触发。
奇怪的是,AudioPlayer对象在所有方面都表现正确,允许我设置新的URL等。但问题是AudioPlayer绝对拒绝播放任何小于40Kb的mp3文件。我已经在这个论坛和其他论坛上发布了关于这个问题的问题,并且基于回答和实验,我有很多证据证明40Kb的限制,没有相反的证据。
那么为什么我不能在Sound对象上创建对象后更改url?提前感谢任何想法。
答案 0 :(得分:3)
我将其置于“已知错误”类别中,请参阅此处:https://jira.appcelerator.org/browse/TIMOB-3348标记为“无法修复”。
错误报告:
var sound = Titanium.Media.createSound(); sound.url = '.. / cricket.wav'; sound.play(); 但是如果我在那之后尝试更改网址,声音仍会播放cricket.wav 声音。
Appcelerator(?)的响应:
“客户问题TIMOB-1488重复。这很容易实现 通过创建一个新的声音对象。此外,这将创造一个 平台奇偶校验问题,并将使任何未来的API复杂化 例如,将支持声道等。声音对象应该是 一旦它被构造就被认为是不可变对象。“
所以创建一个新的声音对象并重新添加事件监听器是我认为的解决方案:
var sampleListener = function(){
alert('something happened');
}
var sound = Ti.Media.createSound({url:myURL});
sound.addEventListener('complete', sampleListener);
sound.play();
//later on, make a new sound object:
sound = Ti.Media.createSound({url:anotherURL});
sound.addEventListener('complete', sampleListener);
sound.addEventListener('someevent', anotherSampleListener);
sound.play();
答案 1 :(得分:0)
如此知道,这也发生在Ti.Media.AudioPlayer上。在这种情况下,建议的解决方案也可以正常工作。