无法用Expo AV读取Blob URI音频?求可用的音频播放替代方案
解决Expo AV无法读取Blob URI音频的问题
一、适配Expo AV的Blob URI处理方法
Expo AV的Audio组件不直接支持Blob URI,你可以通过以下两种方式转换格式后播放:
1. 转换为Base64 Data URI
把数据库获取到的Blob对象转成Base64字符串,拼接成Data URI后传给Expo AV:
// Blob转Base64工具函数 async function blobToBase64(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(blob); }); } // 实际调用 const audioBlob = await fetchYourBlobFromDB(); // 替换为你的Blob获取逻辑 const dataUri = await blobToBase64(audioBlob); // 初始化Expo AV播放器 import { Audio } from 'expo-av'; const sound = new Audio.Sound(); await sound.loadAsync({ uri: dataUri }); await sound.playAsync();
2. 保存为本地文件再播放
借助Expo FileSystem把Blob写入本地存储,用本地文件路径播放:
import * as FileSystem from 'expo-file-system'; // Blob保存到本地工具函数 async function saveBlobToLocal(blob, fileName) { const localUri = `${FileSystem.documentDirectory}${fileName}`; const blobUrl = URL.createObjectURL(blob); await FileSystem.downloadAsync(blobUrl, localUri); URL.revokeObjectURL(blobUrl); return localUri; } // 实际调用 const audioBlob = await fetchYourBlobFromDB(); const localFileUri = await saveBlobToLocal(audioBlob, 'audio.mp3'); const sound = new Audio.Sound(); await sound.loadAsync({ uri: localFileUri }); await sound.playAsync();
二、支持Blob URI的替代播放方案
如果不想做格式转换,可以尝试以下方案:
- HTML5 Audio元素(仅Web端):在Expo Web环境中直接使用原生Audio对象播放Blob URI:
const audio = new Audio(URL.createObjectURL(audioBlob)); audio.play();
注意:该方案仅适用于Web平台,iOS/Android原生环境无法使用。
react-native-sound:第三方React Native音频库,原生支持Blob URI,但需要链接原生依赖,Expo项目需通过EAS Build构建或 eject 后使用。
expo-file-system + expo-av组合:即上述第二种处理方法,属于Expo生态内的方案,跨平台兼容性更好。
内容的提问来源于stack exchange,提问作者Nau_Mar
相关产品推荐
相关产品推荐

