Creator 如何写下载服务器端的音频放到客户端进行播放

用原生java的可以 用cocos creator可不可以也这样用下载服务端的声音文件 然后进行播放 具体的流程是什么样子的呢
目前看资料 找不到cocos下载这块的东西 我看都说用downloader下载 但是在js端不知道怎么写 请高人指点一下

        var arrayBufferHandler = function (item, callback) {
        var url = item.url;
        var xhr = cc.loader.getXMLHttpRequest();
        xhr.open("GET", url, true);
        //xhr.responseType = "arraybuffer";
        xhr.onload = function (oEvent) {
            var arrayBuffer = xhr.response;
            if (arrayBuffer) {
                //var result = new Uint8Array(arrayBuffer);
                // 任何需要的处理
                callback(null, arrayBuffer);
            }
            else {
                callback("error"); // 第一个参数需要传递错误信息
            }
        }
        // 错误处理
        xhr.onerror = function (){}; // 同样需要调用 callback 返回错误信息
        xhr.send(null);
    };

    cc.loader.addDownloadHandlers({
        'txt': arrayBufferHandler
    });

    cc.loader.load({url:"http://192.168.6.214/Test/test.txt",id:"txt"},function (err,data){
        console.log("errerrerrerrerr===",err);
        console.log("datadatadatadata===",data);
    });

我这样实现一个下载txt的功能 是报错的 请高人指点一下 应该如何实现 多谢

1赞

同问!:slightly_smiling:

用xhr就可以呀

读取txt的文件这个我明白 下载的话是返回什么然后直接写入到文件里面 但是声音文件呢 也是这么来弄么 不用管格式什么的么

是呀,然后load读本地文件

如果是音乐的话 我这个应该设置为什么呀
xhr.setRequestHeader(“Content-Type”, “text/plain”);

不要就好,除非你服务器端对头进行了处理(比如说过滤,跳转什么的)

我这边服务的方式是这样的 我获取内容之后想打印出来内容 像这种情况 是不是说我读取的音乐文件就不能打印显示出来了 我获取到的 xhr.responseText 是我要的音乐文件的内容么

sendXHRAB: function (message,callback) {
   
    var xhr = cc.loader.getXMLHttpRequest();
    this.streamXHREventsToLabel(xhr,callback);

    //xhr.responseType = "arraybuffer";
    xhr.open("POST", this.httpurl);

    //xhr.setRequestHeader("Content-Type", "audio/mp3");

    xhr.send(message);
},
streamXHREventsToLabel: function (xhr,callback) {
    var self = this;
    var handler = function (response) {
        console.log("@@@@@@@@"+response);
    };

    // Special event
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) {
            handler(xhr.responseText);
        }
    };
},
1赞

得到结果后用
xhr.responseType = ‘arraybuffer’;
直接xhr.response当成data给处理
if (jsb.fileUtils.writeDataToFile(new Uint8Array(data), filepath)) {
cc.log(‘Remote write file succeed.’);
你要打印什么?文件名吗?二进制文件有什么可打印的

其实就是想知道获取成功是否 当成字符串打印出来是有问题 所以不知道成功与否 因为写文件总是没有 所以想打印出来看一下 我这边试一下 看看是否可以下载到本地 多谢

我直接写入到这个下面 jsb.fileUtils.getWritablePath()

然后load资源的时候 用
cc.loader.load还是cc.loader.loadRes

我用这两个都说不存在 是不是我要设置搜索路径呀 这个应该怎么设置呀

用load,取得时候再加上 jsb.fileUtils.getWritablePath()呀

Sorry can not load “D:\D\cocos\CocosCreator\resources\cocos2d-x\simulator\win32\22.amr” because it is not placed in the “resources” folder.

playVoice:function (voicepath) {
    cc.loader.load({id:"void1",url:cc.url.raw(voicepath)},function (err,data){
        console.log("errrerrrerrrerrrerrrerrrerrrerrrerrrerrrerrr",err);
        console.log("datadatadatadatadatadatadatadatadatadata",data);
    });
}

是不是不能在模拟器上面测试 需要在设备上面测试

D:\D\cocos\CocosCreator\resources\cocos2d-x\simulator\win32\22.amr 这个是有文件的 我这么写是不是有问题

不要再写raw了,那是在你控制的目录下,用来处理相对路径的, jsb.fileUtils.getWritablePath()是绝对路径,直接可用,另外,如果播放可以直接cc.audioEngine.play(filepath, false, 100);

1赞

jsb.fileUtils 应该如何使用,我在 Native下执行但是无响应任何操作