微信小程序的 RequestTask.onChunkReceived
接口允许接收分块的二进制数据流(如视频或音频流),但在小程序环境中,由于不支持 TextDecoder
,处理这些数据时需要采用其他方法。
解析数据流的方案
- 直接处理 ArrayBuffer 数据
微信小程序提供的onChunkReceived
回调会返回ArrayBuffer
数据。可以通过操作ArrayBuffer
和Uint8Array
来解析这些二进制数据。示例代码:
wx.request({
url: 'https://example.com/stream', // 替换为真实数据流地址
method: 'GET',
responseType: 'arraybuffer',
success: function (res) {
console.log('请求成功');
},
onChunkReceived: function (res) {
const chunk = new Uint8Array(res.data); // 转换为 Uint8Array
console.log(chunk);
// 可以调用自定义解析函数解析 chunk
parseChunk(chunk);
}
});
function parseChunk(chunk) {
// 示例解析,将二进制转换为字符串
const str = String.fromCharCode.apply(null, chunk);
console.log(str);
}
模拟 TextDecoder 功能 如果需要将 ArrayBuffer
转换为字符串(如 UTF-8 编码),可以通过自定义方法模拟 TextDecoder
功能:
示例代码:
function arrayBufferToString(buffer) {
const uint8Array = new Uint8Array(buffer);
let str = '';
for (let i = 0; i < uint8Array.length; i++) {
str += String.fromCharCode(uint8Array[i]);
}
return decodeURIComponent(escape(str)); // 解决 UTF-8 编码问题
}
wx.request({
url: 'https://example.com/stream',
method: 'GET',
responseType: 'arraybuffer',
onChunkReceived: function (res) {
const chunkString = arrayBufferToString(res.data);
console.log(chunkString); // 输出解析后的字符串
}
});
处理 JSON 数据流
如果返回的数据是 JSON 格式的分块流,可将分块拼接成完整字符串后再解析 JSON:
let jsonChunks = ''; // 用于存储拼接的 JSON 数据
wx.request({
url: 'https://example.com/stream',
method: 'GET',
responseType: 'arraybuffer',
onChunkReceived: function (res) {
const chunkString = arrayBufferToString(res.data); // 转为字符串
jsonChunks += chunkString;
},
complete: function () {
try {
const jsonData = JSON.parse(jsonChunks); // 拼接完成后解析
console.log(jsonData);
} catch (error) {
console.error('JSON 解析失败:', error);
}
}
});
结合流媒体解码工具
对于复杂的音视频流或其他自定义数据格式,可能需要使用第三方库解析数据(如 MP4Box.js、Flv.js)。在这种情况下,将 ArrayBuffer
数据传递给解析器以获取处理后的内容。
注意事项
- 流式数据拼接问题:分块传输的数据可能包含半个编码单元(如多字节字符的部分字节)。在拼接时要小心处理这种情况,可以缓存未完整的字节流,等待下一个块再拼接解析。
- 性能优化:处理大数据流时避免直接拼接字符串,建议使用
Uint8Array
动态拼接以优化性能。
通过上述方法,可以在微信小程序环境中有效处理 onChunkReceived
返回的二进制数据流。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4575