HarmonyOS 鸿蒙Next websocket的send方法里把.mp3音频文件转成ArrayBuffer发过去
HarmonyOS 鸿蒙Next websocket的send方法里把.mp3音频文件转成ArrayBuffer发过去
但是这个方法只能用以鸿蒙本地的加解密 跨服务的话无法使用 因为android ios 使用的有符号数组-128=> 127 而鸿蒙是0 =>255
所以跨服 使得字符数组所代表的意义不同 无法转换还原
读取文件转换为buferArray的数组的代码demo实例如下
import { BusinessError } from '[@ohos](/user/ohos).base';
import buffer from '[@ohos](/user/ohos).buffer';
let filePath = pathDir + "/test.txt";
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
let arrayBuffer = new ArrayBuffer(4096);//指定长度的与arrayBuffer
//从文件读取数据buf
fs.read(file.fd, arrayBuffer, (err: BusinessError, readLen: number) => {
if (err) {
console.error("read failed with error message: " + err.message + ", error code: " + err.code);
} else {
console.info("read file data succeed");
let buf = buffer.from(arrayBuffer, 0, readLen);
console.info(`The content of file: ${buf.toString()}`);
}
fs.closeSync(file);
});
参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fs-V5#fsread
ArrayBuffer最大长度就是4096 对于一整个文件 没办法读取完整
可以在每次读取之后使用[@ohos](/user/ohos).buffer (Buffer)中的Buffer对象存储本次读取的值 在全部读取完成后 使用buffer.concat()合并所有Buffer的内容 demo参考如下:
async readLocalFileWithStream() {
try {
// 存储每次读取的结果
let buffers: buffer.Buffer[] = [];
// 打开文件流
let inputStream = fs.createStreamSync("文件沙箱路径", 'r+');
// 以流的形式读取源文件内容
let bufSize = 4096;
let readSize = 0;
let buf = new ArrayBuffer(bufSize);
class Option {
public offset: number = 0;
public length: number = bufSize;
}
let option = new Option();
option.offset = readSize;
let readLen = await inputStream.read(buf, option);
// 存储当前读取结果
buffers.push(buffer.from(buf.slice(0, readLen)))
readSize += readLen;
while (readLen > 0) {
option.offset = readSize;
readLen = await inputStream.read(buf, option);
// 存储当前读取结果
buffers.push(buffer.from(buf.slice(0, readLen)))
readSize += readLen;
}
// 关闭文件流
inputStream.closeSync();
// 合并内容
let finalBuf: ArrayBuffer = buffer.concat(buffers).buffer
console.info(`final ArrayBuffer byteLength is ${finalBuf.byteLength}}`)
} catch (error) {
let err = error as BusinessError;
console.error(`readLocalFileWithStream failed, code is ${err.code},message is ${err.message}`);
}
}
在HarmonyOS鸿蒙Next环境中,如果你希望通过WebSocket的send
方法发送.mp3
音频文件,首先需要将该音频文件转换成ArrayBuffer
。以下是实现这一功能的简要步骤:
-
读取音频文件:使用鸿蒙的文件系统API读取
.mp3
文件内容。确保你拥有文件的读取权限。 -
转换内容到ArrayBuffer:将读取到的文件字节数组转换为
ArrayBuffer
。鸿蒙系统通常提供字节数组与ArrayBuffer
之间的转换工具或方法。 -
发送ArrayBuffer:使用WebSocket的
send
方法,将转换后的ArrayBuffer
发送出去。
示例代码(伪代码):
// 假设fileContent是从文件系统中读取到的字节数组
let arrayBuffer = new ArrayBuffer(fileContent.length);
let uint8Array = new Uint8Array(arrayBuffer);
uint8Array.set(fileContent);
// 获取WebSocket连接
let socket = new WebSocket('your-websocket-url');
socket.onopen = function() {
socket.send(arrayBuffer);
};
请注意,上述代码为简化示例,实际使用中需处理文件读取错误、WebSocket连接状态等。如果文件较大,还需考虑分片发送及接收端的重组问题。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html