首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在web应用程序上本地保存数据时选择音频格式

在web应用程序上本地保存数据时选择音频格式
EN

Stack Overflow用户
提问于 2021-07-26 08:17:50
回答 1查看 402关注 0票数 0

我有一个网络应用程序,从用户那里获取一些音频记录输入。还有一个按钮可以在本地保存为音频文件。我得到的结果文件是ogg-opus格式的。具体来说,当我使用file命令时,我在终端中得到了这样的信息:

代码语言:javascript
复制
MyMac$ file Clip.wav 
Clip.wav: Ogg data, Opus audio,
MyMac$ 

我可以用VLC检查录音是否正常。另一方面,我不能像通常使用mp3、m4a或wav文件那样播放重放文件。

代码语言:javascript
复制
MyMac$ afplay Clip.wav
Error: AudioFileOpen failed ('typ?')
MyMac$ 

下面是我的相关代码:

代码语言:javascript
复制
if (navigator.mediaDevices.getUserMedia) {
  // getUserMedia is supported.
  const constraints = { audio: true };
  let chunks = [];

  let onSuccess = function(stream) {
    const mediaRecorder = new MediaRecorder(stream);
    visualize(stream);
    ........

    mediaRecorder.onstop = function(e) {
      ........
      audio.setAttribute('controls', '');
      ........
      audio.controls = true;
      const blob = new Blob(chunks, { 'type' : 'audio/wav;codecs=0' });
      chunks = [];
      ........
      upload.addEventListener("click", 
        function(event) {loadToServer(blob)})
      ........
    }

    mediaRecorder.ondataavailable = function(e) {
      chunks.push(e.data);
    }
  }

  let onError = function(err) {
    console.log('The following error occured: ' + err);
  }

  navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);

} else {
   console.log('getUserMedia not supported on your browser!');
}

我想知道如何修改我的代码,以便生成一个正确的wav文件,甚至是mp3。

注意:

我已经尝试修改了这一行代码:

代码语言:javascript
复制
const blob = new Blob(chunks, { 'type' : 'audio/wav;codecs=0' });

在不同的方面,但都没有任何影响。

EN

回答 1

Stack Overflow用户

发布于 2021-07-26 09:31:18

为了指定录音的mimeType,需要在MediaRecorder开始录音之前告诉MediaRecorder您喜欢哪个mimeType。

代码语言:javascript
复制
- const mediaRecorder = new MediaRecorder(stream);
+ const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });

不幸的是,任何浏览器都不支持audio/wav。当尝试上面的片段时,您将得到一个错误。

因为我也需要wav录音,所以我构建了一个库来添加这个功能。它被称为可扩展媒体记录器,因为它可以与您喜欢的任何其他(音频)编解码器一起扩展。

如果您不想使用第三方库并保持浏览器使用它最喜欢的编解码器,您可以像这样保存您的文件,以便获得一个具有正确后缀的有效文件。

代码语言:javascript
复制
- const blob = new Blob(chunks, { 'type' : 'audio/wav;codecs=0' });
+ const blob = new Blob(chunks, { 'type' : mediaRecorder.mimeType });

后缀将是类型的一部分,在斜杠之后和可能的分号之前。

下面是一个完整的HTML文档的例子,它使用jspm加载可扩展的媒体记录器,而不需要绑定器。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
    </head>
    <body>
        <button id="start" disabled>start</button>
        <button id="stop" disabled>stop</button>
        <script type="module">
            import { MediaRecorder, register } from 'https://jspm.dev/extendable-media-recorder';
            import { connect } from 'https://jspm.dev/extendable-media-recorder-wav-encoder';

            const $start = document.getElementById('start');
            const $stop = document.getElementById('stop');

            await register(await connect());

            const chunks = [];
            const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
            const mediaRecoder = new MediaRecorder(stream, { mimeType: 'audio/wav' });

            mediaRecoder.addEventListener('dataavailable', ({ data }) => {
                chunks.push(data);
            });
            mediaRecoder.addEventListener('stop', ({ data }) => {
                const blob = new Blob(chunks, { type : mediaRecoder.mimeType });

                console.log(blob);
            });

            $start.addEventListener('click', () => {
                mediaRecoder.start();

                $stop.addEventListener('click', () => {
                    $stop.disabled = true;

                    mediaRecoder.stop();
                });

                $start.disabled = true;
                $stop.disabled = false;
            });

            $start.disabled = false;
        </script>
    </body>
</html>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68526556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档