You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:17:15