ios - 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
尝试其他格式时出现相同的错误(这些是我找到并尝试过的格式):
audio/webm
(如上例所示)video/webm
audio/ogg
(桌面上也有错误)audio/ogg; codecs=opus
(桌面上也有错误)
MediaRecorder 是否有任何 mimeType 可以让我在 iOS 设备上使用音频?
我是不是完全错了?
解决方案
事实证明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,而不是故意遇到错误。
但是现在它可以工作,这对于个人项目来说已经足够了。
推荐阅读
- sql - 从 XML 中选择所有匹配的字符串值
- sql-server - 如何在 SQL PDW/Azure SQL DW 中连接具有相同 ID 的多行
- java - android上的FileDownloader它没有显示错误,但下载没有开始
- sql-server - 如何将1列中的多列存储为sql中的值
- php - 将用户角色作为自定义元数据添加到 WooCommerce 订单
- node.js - Deprecation Warning Error with Blockchain
- html - 需要使用 Html.Action 传递参数和 csslink
- javascript - 如何解码 Minecraft 示意图(nbt)文件中的数据(即块状态)字节?
- html - 在 h-100 列内垂直对齐图像
- swift - 为什么在将协议约束到类时不能使用协议所需的初始化程序?