如何实现缓存音频功能(App端详解)

发布于:2025-07-26 ⋅ 阅读:(15) ⋅ 点赞:(0)

本方案提供了符合平台规范的音频缓存实现,通过分层设计确保功能可靠性,同时预留扩展点支持未来优化需求。

📦 音频缓存与播放流程说明

项目目标

实现App端音频资源的自动缓存与播放:

  1. 获取远程音频URL
  2. 下载文件至本地_downloads/目录
  3. 优先使用缓存音频进行播放
  4. 提供缓存管理功能(大小查看、清理)
关键问题与解决方案
问题 解决方案
无法保存到_downloads 使用plus.io.resolveLocalFileSystemURL操作路径
文件名非法字符 使用safeFileName()函数过滤非法字符
缓存安全性 后端代理请求敏感操作

一、获取音频URL流程

安全优化方案
发送单词
通过
前端
后端服务
安全校验
生成加密签名
请求音频API
返回音频URL

实施要点

  1. 前端仅传输必要参数
  2. 敏感操作(签名生成)在后端完成
  3. 增加请求合法性验证

二、缓存与播放核心流程

主流程实现(playAudio函数)
async function playAudio(id, remoteUrl) {
// 平台检测
if (isH5Platform()) {
return playRemoteAudio(remoteUrl); // H5直接播放
}

// 生成缓存文件名
const fileName = `audio-cache-${safeFileName(id)}.mp3`;
const localPath = `_downloads/${fileName}`;

// 检查缓存是否存在
if (await fileExists(localPath)) {
return playLocalAudio(localPath);
}

// 下载并缓存
try {
const tempPath = await downloadFile(remoteUrl);
const permanentPath = await saveToDownloads(tempPath, fileName);
playLocalAudio(permanentPath);
} catch (error) {
playRemoteAudio(remoteUrl); // 降级方案
}
}
文件名安全处理
function safeFileName(id) {
// 保留安全字符,过滤特殊符号
return id.replace(/[^a-zA-Z0-9\-_\.]/g, '');
}

三、本地缓存操作详解

缓存大小获取
async function getAudioCacheSize() {
return new Promise((resolve) => {
getDirectoryEntries('_downloads/', (entries) => {
const cacheFiles = entries.filter(e => e.name.startsWith('audio-cache-'));
const totalSize = calculateTotalSize(cacheFiles);
resolve(formatFileSize(totalSize));
});
});
}
缓存清理
async function clearAudioCache() {
return new Promise((resolve) => {
getDirectoryEntries('_downloads/', (entries) => {
const deletions = entries
.filter(e => e.name.startsWith('audio-cache-'))
.map(file => deleteFile(file));

Promise.all(deletions).then(() => resolve(true));
});
});
}
缓存保存流程
App TempStorage PermanentStorage AudioPlayer 下载文件 返回临时路径 请求文件转移 返回永久路径 播放音频 App TempStorage PermanentStorage AudioPlayer

关键步骤

  1. 下载文件到临时存储
  2. 通过copyTo操作转移到永久目录
  3. 系统自动清理临时文件

🔚 功能总结

功能模块 实现方式
音频URL获取 后端代理请求,前端传输必要参数
播放入口 playAudio(id, url) 统一入口
缓存位置 _downloads/audio-cache-{safeID}.mp3
文件转移 系统API实现安全文件转移
缓存管理 getAudioCacheSize()clearAudioCache()
异常处理 缓存失败时自动播放远程音频
注意事项
  1. 平台权限:确保App有本地存储权限
  2. 缓存策略
  • 建议添加缓存上限(如100MB)
  • 实现LRU(最近最少使用)清理机制
  1. 网络优化
  • 大文件下载显示进度条
  • 支持暂停/恢复下载
  1. 安全存储:敏感内容建议加密存储

网站公告

今日签到

点亮在社区的每一天
去签到