从Google Drive获取WAV文件生成AudioBuffer遇报错及字段缺失问题
问题解决:Google Drive WAV文件获取AudioBuffer报错及webContentLink缺失问题
一、解决TypeError: response.body.getReader is not a function报错
报错原因
gapi.client.drive.files.get不支持responseType: "stream"配置,返回的response.body并非浏览器原生的ReadableStream对象,因此没有getReader()方法。- 错误使用
createMediaStreamSource:该API用于处理实时媒体流(如麦克风/摄像头输入),而decodeAudioData直接接收ArrayBuffer格式的音频数据即可,无需转成媒体流。
修正后的代码
const query = `parents='${folderId}' and mimeType = 'audio/wav'`; const response = await gapi.client.drive.files.list({ q: query, supportsAllDrives: true, includeItemsFromAllDrives: true, }); const files = response.result.files; console.log("AUDIO files: ", files); // Web Audio API 初始化(需确保在用户交互后创建,如点击事件内) const context = new AudioContext(); const channel0Buffers = []; const channel1Buffers = []; for (let i = 0; i < files.length; i++) { const file = files[i]; const fileId = file.id; // 获取音频文件的ArrayBuffer数据 const audioResponse = await gapi.client.drive.files.get({ fileId: fileId, alt: "media", supportsAllDrives: true, includeItemsFromAllDrives: true, }); // 确保数据是标准ArrayBuffer格式 const arrayBuffer = audioResponse.body instanceof ArrayBuffer ? audioResponse.body : new Uint8Array(audioResponse.body).buffer; // 解码音频数据为AudioBuffer const audioBuffer = await context.decodeAudioData(arrayBuffer); // 按需求分类存储 if (i < 2) { channel0Buffers.push(audioBuffer); } else { channel1Buffers.push(audioBuffer); } }
二、解决无法获取webContentLink的问题
常见原因及解决方案
未指定返回字段
在files.list或files.get请求中,必须显式指定fields参数包含webContentLink,否则默认不会返回该字段:// 示例:files.list时指定返回字段 const response = await gapi.client.drive.files.list({ q: query, supportsAllDrives: true, includeItemsFromAllDrives: true, fields: "files(id, name, webContentLink)" // 按需添加其他字段 });文件权限限制
- 若文件仅设置了「查看」权限,而非「查看和下载」,则不会返回
webContentLink,需调整文件共享权限。 - 共享驱动器中的文件,需确保当前授权账号拥有下载权限。
- 若文件仅设置了「查看」权限,而非「查看和下载」,则不会返回
替代下载方案
如果无法获取webContentLink,可直接构造下载链接:https://www.googleapis.com/drive/v3/files/{fileId}?alt=media该链接配合gapi自动携带的授权头,可直接用于浏览器下载或请求音频数据。
内容的提问来源于stack exchange,提问作者Eli7
相关产品推荐
相关产品推荐

