cdn要开启跨域,我们试了可以
小程序使用wx.previewImage无法显示图片,一直黑屏一直转圈无法显示[图片]
05-15设置了 original 安卓鸿蒙才会,苹果不会提示 res = await uni.chooseMedia({ count: 20, sourceType: ["album", "camera"], sizeType: ["original"], });
chooseMeida 选择原图上传视频,出现“压缩中请稍后”,稳定复现;此问题十分影响用户体验; 手机机型:小米 12 Xiaomi HyperOS 1.0.11.0.ULCCNXM 小程序:简单云链
05-09感谢博主分享 。 改进了一个demo 临时文件 + uniapp + vue3 ts 实现的demo。 多段base64音频合并播放。 最终语音为 深圳。(最后的语音有点断,因为太长了评论超长了) // AudioPlayer.vue import { ref } from "vue"; import { testData } from './videoAudioChunks' interface AudioMessage { header: { code: number; message: string; sid: string; status: number; }; payload?: { audio?: { audio: string; bit_depth: number; ced: string; channels: number; encoding: string; frame_size: number; id: string; sample_rate: number; seq: number; status: number; type: string; }; }; } interface AudioChunk { array: Uint8Array; seq: number; id: string; } const playing = ref(false); const currentAudioPath = ref(''); // 生成临时文件路径 const generateTempFilePath = () => { const timestamp = new Date().getTime(); return `${uni.env.USER_DATA_PATH}/temp_audio_${timestamp}.mp3`; }; // 清理临时文件 const cleanupTempFile = (filePath: string) => { const fs = uni.getFileSystemManager(); fs.access({ path: filePath, success: () => { fs.unlink({ filePath, success: () => { console.log('临时文件清理成功'); }, fail: (err) => { console.error('清理临时文件失败:', err); } }); } }); }; // 处理并播放音频 const processAndPlay = () => { const uniqueChunks = new Map<string, AudioChunk>(); const audioJson = testData // 处理每个音频消息 audioJson.forEach((message) => { if (message.header.code === 0 && message.payload?.audio) { const audio = message.payload.audio; const key = `${audio.id}_${audio.seq}`; // 仅处理未见过的块 if (!uniqueChunks.has(key)) { const audioData = audio.audio; uniqueChunks.set(key, { array: new Uint8Array( atob(audioData) .split("") .map((char) => char.charCodeAt(0)) ), seq: audio.seq, id: audio.id, }); } } }); // 按id和seq排序块 const sortedChunks = Array.from(uniqueChunks.values()).sort((a, b) => { if (a.id === b.id) { return a.seq - b.seq; } return parseInt(a.id) - parseInt(b.id); }); // 合并所有音频块 const totalLength = sortedChunks.reduce( (acc, chunk) => acc + chunk.array.length, 0 ); const combinedArray = new Uint8Array(totalLength); let offset = 0; sortedChunks.forEach((chunk) => { combinedArray.set(chunk.array, offset); offset += chunk.array.length; }); // 生成新的临时文件路径 const tempAudioPath = generateTempFilePath(); const fs = uni.getFileSystemManager(); // 清理之前的临时文件 if (currentAudioPath.value) { cleanupTempFile(currentAudioPath.value); } // 将合并后的数据转换为base64 const base64Data = uni.arrayBufferToBase64(combinedArray); // 写入文件并播放 fs.writeFile({ filePath: tempAudioPath, data: base64Data, encoding: "base64", success() { currentAudioPath.value = tempAudioPath; const backgroundAudioManager = uni.getBackgroundAudioManager(); backgroundAudioManager.title = "音频播放"; backgroundAudioManager.src = tempAudioPath; playing.value = true; backgroundAudioManager.onEnded(() => { playing.value = false; // 播放结束后清理临时文件 cleanupTempFile(tempAudioPath); currentAudioPath.value = ''; }); }, fail(err) { console.error("写入音频文件失败:", err); }, }); };
小程序能不能直接使用base64音频文件播放?使用createInnerAudioContext方法来,存文件到云服务器太费流量了
01-08