HarmonyOS 鸿蒙Next websocket的send方法里把.mp3音频文件转成ArrayBuffer发过去

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS 鸿蒙Next websocket的send方法里把.mp3音频文件转成ArrayBuffer发过去

我这边录音后将.mp3的文件保存在沙盒,在沙盒拿到文件路径后,怎么将.mp3的文件转成可以在websocket的send方法里传递的ArrayBuffer格式的数据

2 回复
可以将文件转换成buferArray的数组 然后转成Base64的字符串 在使用加解密进行解密
但是这个方法只能用以鸿蒙本地的加解密 跨服务的话无法使用 因为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。以下是实现这一功能的简要步骤:

  1. 读取音频文件:使用鸿蒙的文件系统API读取.mp3文件内容。确保你拥有文件的读取权限。

  2. 转换内容到ArrayBuffer:将读取到的文件字节数组转换为ArrayBuffer。鸿蒙系统通常提供字节数组与ArrayBuffer之间的转换工具或方法。

  3. 发送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

回到顶部