首页 > 解决方案 > MediaRecorder iOS 14.6:不支持 mimeType

问题描述

我正在通过网站录制和发送音频。为此,我使用 MediaRecorder API。

根据MediaRecorder 文档,在桌面或 Android 设备上使用该网站时没有问题,因为 2020 年 9 月发布,iOS 14 也应该得到支持。

MediaRecorder 是这样实例化的:

navigator.mediaDevices.getUserMedia({ audio: true, video: false })
  .then((stream) => {
    // Some validation and other processing. Omitted for brevity.

    const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/webm' });

    // Using the mediaRecorder. Omitted for brevity.
  });

在带有 iOS 14.6 的 iPhone 12 上执行此操作时,我从该实例化行收到以下错误:

NotSupportedError: mimeType is not supported

尝试其他格式时出现相同的错误(这些是我找到并尝试过的格式):

MediaRecorder 是否有任何 mimeType 可以让我在 iOS 设备上使用音频?

我是不是完全错了?

标签: iosaudio-streamingweb-mediarecorder

解决方案


事实证明video/mp4适用于 iOS。它也可以仅用于音频,即使它说的是视频。

由于其他浏览器不支持,因此可以使用video/mp4带有 的 try/catch作为后备,这导致以下解决方案:video/mp4

let mediaRecorder;
try {
  mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/webm' });
}
catch (err1) {
  try {
    // Fallback for iOS
    mediaRecorder = new MediaRecorder(stream, { mimeType: 'video/mp4' });
  }
  catch (err2) {
    // If fallback doesn't work either. Log / process errors.
    console.error({err1});
    console.error({err2})
  }
}

可以通过以下方式使代码更清晰、更明确:

  • NotSupportedError明确地捕捉
  • 查询设备/操作系统并明确使用相应的 mimeType,而不是故意遇到错误。

但是现在它可以工作,这对于个人项目来说已经足够了。


推荐阅读