我刚刚意识到cordova媒体插件中有一个release()
函数。我想知道你是否应该在每次play()
电话或其他时间之后发布成功回调?
缓存声音效率更高吗?我有大约六种声音效果,所以我可以将媒体对象缓存在一个数组中,而不是每次都创建一个新的媒体对象 - 我应该这样做吗?
我看到this question关于如何发布,有些评论可以缓存而不是发布每个游戏。
这是我的代码(不使用任何缓存):
function playMP3(fileName, callback) {
if (window.Media) {
var mp3URL = getMediaURL(fileName);
var media = new Media(mp3URL, function() {
// success
// release the media resource once finished playing here?
media.release();
if (callback) {
callback();
}
}, function (err) {
// error
jlog("failed to play mp3 file: [" + fileName + "]");
try {
// release the media resource once finished playing here too?
media.release();
} catch (e) {
// ignore error on release
}
if (callback) {
callback();
}
});
if (media) media.play();
}
}
function getMediaURL(s) {
if (window.device && window.device.platform.toLowerCase() === "android") {
return "/android_asset/www/sounds/" + s;
} else {
s = "sounds/" + s; //put everything in sounds directory
return s;
}
}
答案 0 :(得分:0)
如果有人正在寻找cordova音效缓存,我会给出更新。我添加了一些缓存以获得良好的衡量标准,它似乎可行,但我不知道它是否会提高内存使用率或其他任何内容。
我的问题是回调会让它变得太复杂(因为回调最终会被缓存),所以我决定简化并只使用一个计时器,因为这就是Speaking Email中大部分声音所需要的。当我需要适当的完成回调时,我跳过缓存。
function playMP3(fileName, callback) {
if (window.Media) {
if (!window.soundEffectCache) {
window.soundEffectCache = {};
}
var sfx = window.soundEffectCache[fileName];
if (!sfx) {
var mp3URL = getMediaURL(fileName);
sfx = new Media(mp3URL);
window.soundEffectCache[fileName] = sfx;
}
sfx.play();
}
// callback is not really after finishing, just a sec after starting
if (callback) {
window.setTimeout(callback, 500);
}
}