2.4.5 creator 支持播放base64的音效吗

如题,之前用的1.9.3的自定义引擎,支持了播放base64音效,最近项目升级到2.4.5,发现 audioEngine 要使用AudioClip 去播放音效,请问可以支持base64 吗

1赞

已解决,根据之前项目,在2.4.5的基础上简单修改了下引擎

  1. 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;
                     });
                 }
    
             }
         }
     },
    
  2. 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;
    
  3. 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天后自动关闭。不再允许新的回复。