李朗
李朗
  • 发布:2025-02-08 13:33
  • 更新:2025-02-11 09:39
  • 阅读:31

请教uniapp的app端如何保存arraybuffer为本地mp3

分类:uni-app

有一个需求是通过wss接收二进制数据,需要在app内保存为mp3进行播放,使用了arraybuffer转base64然后写入文件不能播放
以下是尝试过的代码
<template>
<view class="content">
{{ imgPath }}
<image :src="'file://' + imgPath"></image>

    <view class="text-area">  
        <!-- <text class="title">{{ title }}</text> -->  
    </view>  
</view>  

</template>

<script>
const innerAudioContext1 = uni.createInnerAudioContext();
const innerAudioContext2 = uni.createInnerAudioContext();
innerAudioContext1.autoplay = true;
innerAudioContext2.autoplay = true;
innerAudioContext1.onWaiting(() => {
console.log("播放器1加载");
});
innerAudioContext2.onWaiting(() => {
console.log("播放器2加载");
});
innerAudioContext1.onError((e) => {
console.log("播放器1错误", JSON.stringify(e));
});
innerAudioContext2.onError((e) => {
console.log("播放器2错误", JSON.stringify(e));
});
// innerAudioContext1.src =
// "https://web-ext-storage.dcloud.net.cn/uni-app/ForElise.mp3";
export default {
data() {
return {
imgPath: "", // 图片本地存储路径
imgBase64Data: "",
title: "Hello",
};
},
onLoad() {
this.getImg();
// this.testFile();
},
methods: {
getImg() {
const _this = this;
uni.request({
// url: "http://sky808.com/mpweimi.jpg",
url: "https://web-ext-storage.dcloud.net.cn/uni-app/ForElise.mp3",
responseType: "arraybuffer",
success(res) {
console.log("成功", res);
let base64String = uni.arrayBufferToBase64(res.data);
// _this.imgBase64Data = data:image/jpeg;base64, ${base64String};
// base64String = data:audio/mp3;base64, ${base64String};
// console.log(_this.imgBase64Data);
_this.testFile(base64String);
// _this.testFile(_this.res.data); // 直接保存二进制
},
});
},

    testFile(base64Data) {  
        const _this = this;  
        // 获取本应用私有目录文件操作对象  
        plus.io.requestFileSystem(  
            // plus.io.PRIVATE_DOC,  
            plus.io.PUBLIC_DOCUMENTS,  
            function (fs) {  
                console.log("请求文件系统成功!");  
                fs.root.getFile("li.mp3", { create: true }, function (fileEntry) {  
                    // 写文件-s  

                    fileEntry.createWriter(  
                        function (writer) {  
                            writer.onwrite = function (e) {  
                                console.log("写入数据成功!");  
                                // const fileURL = fileEntry.toLocalURL();  
                                const fileURL = fileEntry.toRemoteURL();  
                                console.log("转换的url", fileURL);  
                                console.log(JSON.stringify(e));  
                                _this.imgPath = fileURL;  
                                innerAudioContext1.src = fileURL;  
                                console.log("播放器1src", innerAudioContext1.src);  
                                innerAudioContext1.play();  
                                // innerAudioContext2.src = "file://" + e.target.fileName;  
                                innerAudioContext2.src = fileEntry.toLocalURL();  
                                innerAudioContext2.play();  
                                console.log("播放器2src", innerAudioContext2.src);  
                                console.log("播放器调用完成");  
                            };  
                            // 将数据写入文件末尾。  

                            // writer.seek(writer.length);  
                            writer.write(base64Data, "base64");  
                        },  
                        function (e) {  
                            console.error(e.message);  
                        }  
                    );  

                    // 写文件-e  
                    fileEntry.file(function (file) {  
                        var fileReader = new plus.io.FileReader();  
                        console.log("获取的文件信息:" + JSON.stringify(file));  

                        fileReader.readAsText(file, "utf-8");  

                        fileReader.onloadend = function (evt) {  
                            // console.log("加载结束:", JSON.stringify(evt));  
                        };  
                        console.log(file.size + "--" + file.name);  
                    });  
                });  
            },  
            function (e) {  
                console.error("Request file system failed: " + e.message);  
            }  
        );  
    },  
},  

};
</script>

<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}

.text-area {
display: flex;
justify-content: center;
}

.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

2025-02-08 13:33 负责人:无 分享
已邀请:
吃俺老孙一棒

吃俺老孙一棒 - 狼行千里吃肉,狗行千里吃屎

export default {
testFile(base64Data) {
const _this = this;
// 获取本应用私有目录文件操作对象
plus.io.requestFileSystem(
plus.io.PRIVATE_DOC,
function (fs) {
console.log("请求文件系统成功!");
fs.root.getFile("li.weimp3", { create: true }, function (fileEntry) {
// 写文件-s
fileEntry.createWriter(
function (writer) {
writer.onwrite = function (e) {
console.log("写入数据成功!");
const fileURL = fileEntry.toLocalURL();
console.log("转换的url", fileURL);
console.log(JSON.stringify(e));
_this.imgPath = fileURL;
innerAudioContext1.src = fileURL;
console.log("播放器1src", innerAudioContext1.src);
innerAudioContext1.play();
innerAudioContext2.src = fileURL;
innerAudioContext2.play();
console.log("播放器2src", innerAudioContext2.src);
console.log("播放器调用完成");
};
// 将Base64数据转换为二进制数据
const binaryData = _this.base64ToArrayBuffer(base64Data);
writer.write(binaryData);
},
function (e) {
console.error("创建文件写入对象失败: " + e.message);
}
);
// 写文件-e
},
function (e) {
console.error("创建文件失败: " + e.message);
}
),
function (e) {
console.error("Request file system failed: " + e.message);
}
);
},
base64ToArrayBuffer(base64) {
const binaryString = atob(base64);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
};

要回复问题请先登录注册