javascript - 保存录制的音频 blob [JS]
问题描述
我正在通过麦克风录制用户语音并将其保存为 Google Drive 上的文件(使用 GDrive API)。当我在浏览器中收听上传到驱动器的音频时,我没有遇到任何问题。但是,当我从 GDrive 下载文件时,它会在没有扩展名的情况下下载(有点像 textedit 文档)。
我试图修改下载文件的扩展名并播放它,但它不能在 QuickTime、VLC 甚至 Audacity 等上播放。
这是我录制音频的方式
function recordVisitorMsg() {
navigator.mediaDevices.getUserMedia({
audio: true
})
.then(stream => {
const mediaRecorder = new MediaRecorder(stream);
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start();
const audioChunks = [];
mediaRecorder.addEventListener("dataavailable", event => {
audioChunks.push(event.data);
});
mediaRecorder.addEventListener("stop", () => {
audioBlob = new Blob(audioChunks, {
'type': 'audio/mp3'
});
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
audio = new Audio(audioUrl);
audio.play();
});
setTimeout(() => {
mediaRecorder.stop();
}, 3000);
});
}
这是我上传到云端硬盘的方式。
form = new FormData();
form.append('metadata', new Blob([JSON.stringify(metadata)], {
type: 'application/json'
}));
form.append('audio-file', audioBlob);
let refresh_request = {
body: post_body,
method: "POST",
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded'
})
}
// trimmed the secret keys code for length, not necessary here
fetch(refresh_url, refresh_request).then(response => {
return (response.json());
}).then(response_json => {
console.log(response_json);
var xhr = new XMLHttpRequest();
xhr.open('post', 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id');
xhr.setRequestHeader('Authorization', 'Bearer ' + response_json.access_token);
xhr.responseType = 'json';
xhr.onload = () => {
console.log(xhr.response.id); // Retrieve uploaded file ID.
};
xhr.send(form);
});
我是新手,所以如果在这个过程中有一些小问题,请原谅。同样,当我在浏览器的 GDrive 中播放它时,它也能正常播放。问题是当我下载时 - 它没有扩展名。手动扩展/修改也无助于在任何播放器中播放文件。请帮忙,谢谢!
解决方案
我不确定这是否能完全解决问题,但我认为mimeType
在创建Blob
. 不幸的是,没有允许使用.mp3 录制 MP3 的浏览器MediaRecorder
。mimeType
例如,Chrome 中的默认设置是'audio/webm'
. 您可以mimeType
从中读取MediaRecorder
以在创建Blob
.
audioBlob = new Blob(
audioChunks,
{ type: mediaRecorder.mimeType }
);
它也可能有助于创建 aFile
而不是Blob
. 它允许您设置文件名,从而设置扩展名。一种快速而肮脏的方法是mimeType
像这样解析。
audioBlob = new File(
audioChunks,
`my-file.${mediaRecorder.mimeType.match(/\/([\w\d]+);?/)[1]}`,
{ type: mediaRecorder.mimeType }
);
在 Chrome 中,这应该等于以下硬编码版本。
audioBlob = new File(
audioChunks,
'my-file.webm',
{ type: 'audio/webm' }
);
推荐阅读
- dynamics-crm - 在 Dynamics CRM 中查询以查找相关帐户的订单产品
- http - 响应后的异步工作
- spring-mvc - spring mvc:当请求内容类型为 x-www-form-urlencoded 时绑定嵌套请求参数
- reactjs - 在静态网站上使用 ReactJS
- odoo-11 - odoo11 :: wkhtmltopdf 无法识别 css
- android - 使用 Google 服务 v15 部署应用程序时出错
- grails - 没有这样的属性:类的属性名称:org.grails.orm.hibernate.cfg.HibernatePersistentEntity
- jquery - 根据在 Jquery 数据表的“显示下拉菜单”中选择的页面大小显示数据
- java - 在端口/适配器(洋葱)架构中,如果应用程序中没有持久性,我可以拥有域吗?
- mysql - 重置mysql密码结果:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)