如何在JavaScript中设置音频blob的编解码器、采样率和比特率?

11

我刚刚创建了一个 Blob:

const audioBlob = new Blob(audioChunks, { 'type' : 'audio/wav; codecs=0' });

然后以base64格式将其发送到后端。使用以下代码将其保存到名为“test.wav”的文件中:

await writeFile('./temp/test.wav', Buffer.from(filename.replace('data:audio/wav; codecs=0;base64,', ''), 'base64'), 'base64');

在输出文件“test.wav”中,我得到的编解码器是opus,比特率为N / A,采样率为48000。我想将这些值更改为codec = wav,bitrate = 256kbps和sample rate = 16000。如何在node(或angular)中实现?

这里是我的前端代码链接。


在16kHz的未压缩WAV音频中,无法拥有256kbps的比特率。假设是单声道和16位采样(通常情况下),您的比特率将为16000个采样/秒 * 2个字节/采样= 32000字节/秒。 - AKX
3
请展示更多的代码;audioChunks变量是从哪里获取的? - AKX
1
你需要查看AudioRecorder的mimeType属性。 不能仅仅假设在“dataavailable”回调中收到的数据块可以解释为PCM WAV,并创建具有该类型的blob。例如,我在WebM容器中看到了audio/webm;codecs=opus,即OPUS。一旦您拥有已知格式的数据,就可以使用转码器(例如ffmpeg)将其转换为另一种格式。 - AKX
你可能无法从MediaRecorder中获取未压缩的音频。这似乎列举了Chrome支持的一些类型。https://cs.chromium.org/chromium/src/third_party/blink/web_tests/fast/mediarecorder/MediaRecorder-isTypeSupported.html - AKX
关于你想做的事情的博客文章:https://addpipe.com/blog/using-recorder-js-to-capture-wav-audio-in-your-html5-web-site/ - Gillsoft AB
显示剩余2条评论
1个回答

9

这行代码只是提供mime信息而不影响实际输出。

const audioBlob = new Blob(audioChunks, { 'type' : 'audio/wav; codecs=0' });

为了选择正确的音频编解码器和比特率,请使用以下选项开始录制:

var options = {
  audioBitsPerSecond : 128000,
  mimeType : 'audio/ogg'
}
var mediaRecorder = new MediaRecorder(stream, options);

据我所知,ogg编解码器在WebRTC中默认支持,因此它具有跨浏览器兼容性。
后来,在后端方面,您需要使用例如fluent-ffmpegogg音频流转换为任何其他您想要的格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接