Ema*_*lta 7 javascript blob file wav typescript
我正在录制演讲并将其转换为可下载的 WAV 文件。我正在使用 Angular6 和 MediaRecorder。首先,我获取 blob,然后从 blob 中获取 .wav 文件。问题是 WAV 文件(可以播放并且听起来不错)在此过程中丢失了大部分属性,并且不是有效的 WAV。它一直是一个 WebM 文件。为了进一步处理,我需要真正有效和高质量的 WAV 文件。最后,我得到了 ~20KB 的文件,而不是 ~300KB 的更大文件。
我的代码如下所示:
//convert Blob to File. Pass the blob and the file title as arguments
var blobToFile = (theBlob: Blob, fileName:string): File => {
var b: any = theBlob;
//Add properties to the blob
b.lastModifiedDate = new Date();
b.name = fileName;
return <File>theBlob;
}
var browser = <any>navigator;
var headers = new Headers();
var audioCtx = new AudioContext();
var chunks =[];
var constraints = { audio: true, video: false };
var promisifiedOldGUM = function(constraints, successCallback, errorCallback) {
var getUserMedia = (browser.getUserMedia || browser.webkitGetUserMedia || browser.mozGetUserMedia || browser.msGetUserMedia);
// Some browsers just don't implement it - return a rejected promise with an error to keep a consistent interface
if(!getUserMedia) {
return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
}
// Otherwise, wrap the call to the old navigator.getUserMedia with a Promise
return new Promise(function(successCallback, errorCallback) {
getUserMedia.call(browser, constraints, successCallback, errorCallback);
});
}
if (browser.mediaDevices.getUserMedia) {
browser.mediaDevices.getUserMedia(constraints).then((stream) => {
this.mediaRecorder = new MediaRecorder(stream);
this.mediaRecorder.onstop = function(){
var last_bit= chunks[chunks.length-1];
var blob = new Blob([last_bit], { 'type' : 'audio/wav' });
var audioURL = window.URL.createObjectURL(blob);
//convert Blob to file
var file = blobToFile(blob, "my-recording.wav");
var link = document.createElement("a");
link.href = audioURL;
link.download = 'audio_recording_' + new Date().getTime() + '.wav';
link.innerHTML = "download file";
document.body.appendChild(link);
};
Run Code Online (Sandbox Code Playgroud)
typings.d.ts
文件中的 MediaRecorder 设置如下所示:
declare class MediaRecorder extends EventTarget {
// readonly mimeType: string;
readonly MimeType: 'audio/x-wav'; // 'audio/vnd.wav';
readonly state: 'inactive' | 'recording' | 'paused';
readonly stream: MediaStream;
ignoreMutedMedia: boolean;
videoBitsPerSecond: number;
audioBitsPerSecond: 16000//number;
ondataavailable: (event : MediaRecorderDataAvailableEvent) => void;
onerror: (event: MediaRecorderErrorEvent) => void;
onpause: () => void;
onresume: () => void;
onstart: () => void;
onstop: () => void;
constructor(stream: MediaStream);
start();
stop();
resume();
pause();
isTypeSupported(type: string): boolean;
requestData();
addEventListener<K extends keyof MediaRecorderEventMap>(type: K, listener: (this: MediaStream, ev: MediaRecorderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
removeEventListener<K extends keyof MediaRecorderEventMap>(type: K, listener: (this: MediaStream, ev: MediaRecorderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何更改blobToFile()
功能以在转换过程中保持录音质量。如果你能帮我解决这个问题,我将不胜感激。
正如我在评论中链接的文件的元数据中看到的那样。您使用压缩文件的编解码器(此处为 Opus)。
我看到两种解决方案:
WAV
未压缩配置的容器(例如 PCM)正如你在聊天中向我描述的问题,我认为这更像是第二种解决方案。我自己不使用 mediarecorder,但我发现这种方法可以检查 mime 类型是否适用于它。
MediaRecorder.isTypeSupported("audio/wav;codecs=MS_PCM")
Run Code Online (Sandbox Code Playgroud)
那么你我建议你在创建Blob
to时更改 mime 类型
new Blob(chunks, { 'type' : 'audio/wav; codecs=MS_PCM' });
Run Code Online (Sandbox Code Playgroud)
或者
new Blob(chunks, { 'type' : 'audio/wav; codecs=0' });
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13191 次 |
最近记录: |