如题,之前用的1.9.3的自定义引擎,支持了播放base64音效,最近项目升级到2.4.5,发现 audioEngine 要使用AudioClip 去播放音效,请问可以支持base64 吗
1赞
已解决,根据之前项目,在2.4.5的基础上简单修改了下引擎
-
CCAudioClip.js 增加base64 音效加载
var LoadMode = cc.Enum({ WEB_AUDIO: 0, DOM_AUDIO: 1, BASE64_AUDIO : 2, }); setBase64Audio (base64) { this.loadMode = LoadMode.BASE64_AUDIO; this._nativeUrl = base64 || ""; }, _ensureLoaded (onComplete) { if (this.loaded) { return onComplete && onComplete(); } else { if (onComplete) { this.once('load', onComplete); } if (!this._loading) { this._loading = true; let self = this; if (this.loadMode == LoadMode.BASE64_AUDIO) { cc.assetManager.loadAny({ url : this._nativeUrl, }, (err, audio) =>{ self._loading = false; if (err) { cc.error('load Base64Audio error : ' + err); return; } self._nativeAsset = audio; }) } else { cc.assetManager.postLoadNative(this, function (err) { self._loading = false; }); } } } }, -
urlTransformer.js 增加base64 url ext 的解析
parse 方法case RequestType.URL: out.url = item.url; out.uuid = item.uuid || item.url; out.ext = item.ext || cc.path.extname(item.url); out.isNative = item.__isNative__ !== undefined ? item.__isNative__ : true; try { // add base64 ext let url = item.url; if (/^data:[^;]+;base64,/.test(url) && out.ext == "") { let ext = /^data:audio\/([^;,]+);/i.exec(url); if (ext) { ext = ext[1].toLowerCase(); } out.ext = "." + ext; } } catch(error){ console.error (error.message); } break; -
downloader.js 增加base64的 加载
var context = __audioSupport.context; var DecNode = function () { } var decode_stream = function (decnode, url, onComplete) { try { context["decodeAudioData"] (decnode.buf, function(buffer){ //success if (onComplete) { onComplete(null, buffer); } }, function () { // only on error attempt to sync on frame boundary // retry if (cc.sys.os == cc.sys.OS_IOS || cc.sys.os == cc.sys.OS_OSX) { // retry if (syncStream (decnode)) { decode_stream (decnode,item,callback); } return ; } // none-IOS platform if (callback && item) { //error callback('decode error - ' + item.id, null); } }); } catch (e) { } } var loadBase64Audio = function (url, options, onComplete){ try{ var data = atob(url.split(',')[1]); var dataView = new Uint8Array(data.length); for (var i=0; i<data.length; ++i) { dataView[i] = data.charCodeAt(i); } let decnode = new DecNode (); decnode.buf = dataView.buffer; decnode.sync = 0; decnode.retry = 0; decode_stream (decnode, url, onComplete); } catch(err){ console.error (err.message); } } var downloadAudio = function (url, options, onComplete) { // add loadBase64Audio if (/^data:[^;]+;base64,/.test(url)) { loadBase64Audio(url, options, onComplete); } else { // web audio need to download file as arrayBuffer if (options.audioLoadMode !== cc.AudioClip.LoadMode.DOM_AUDIO) { downloadArrayBuffer(url, options, onComplete); } else { downloadDomAudio(url, options, onComplete); } } }
2赞
该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。