视频 mediaDevices 将 Blob 分配给“videoRef.srcObject”以代替“src”

Posted

技术标签:

【中文标题】视频 mediaDevices 将 Blob 分配给“videoRef.srcObject”以代替“src”【英文标题】:Video mediaDevices Assign a Blob To 'videoRef.srcObject' In Place of 'src' 【发布时间】:2018-11-13 03:16:41 【问题描述】:

我正在尝试将 blob 作为视频元素的 src。我的代码在以下情况下运行良好:

videoRef.src = URL.createObjectURL(blob)

但不推荐使用 'src' 和 'URL.createObjectURL' 来代替使用 'srcObject' https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL

和https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia

我的问题是如何像这样简单地将 blob 文件添加到 srcObject:

videoRef.srcObject = blob

当我尝试上述代码时,我收到错误消息:“TypeError: 无法在 'htmlMediaElement' 上设置 'srcObject' 属性:提供的值不是 'MediaStream' 类型。”

如何不使用已弃用的 videoRef.src 并将 blob 直接应用于 videoRef.srcObject ?还是blob类型可以用src,只有stream不能用src?

【问题讨论】:

【参考方案1】:

URL.createObjectURL 仅被 弃用,而不是 blob 和媒体源。

您引用的 MDN 警告位于标题为 Using object URLs for media streams 的部分下。警告本身说:

如果您仍有依赖 createObjectURL() 将 附加到媒体元素的代码

正在努力弃用 URL.createObjectURL,特别是围绕 ,因为流本质上是本地对象。

TypeError:无法在“HTMLMediaElement”上设置“srcObject”属性

您的浏览器似乎还没有为 blob 实现 srcObject。这是普通的atm。

例如Chrome 和 Firefox 都有 partial support 用于 srcObject 仅用于流,而不是 blob、文件或媒体源。

srcObject 上的 MDN 回应了这一点:

截至 2017 年 11 月,浏览器仅支持 MediaStream。对于 MediaSource、Blob 和 File,您必须使用 URL.createObjectURL() 创建一个 URL 并将其分配给 HTMLMediaElement.src。

【讨论】:

URL.createObjectURL 仅在流中被弃用......很棒的响应。谢谢! 但是在这里developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/… 他们给出了一个MediaSource 的例子,并为createObjectURL 选项添加了一条评论“避免在新的浏览器中使用它,因为它正在消失”。这令人困惑。 @AlexanderZinchuk 你说得对,MDN example 令人困惑,所以我更新了它。 PTAL! 我爱你,希望你有我的孩子【参考方案2】:

除了 jib 的回答之外,这里有一个来自 MDN 的代码 sn-p,详细说明了支持旧浏览器的后备方案:

const mediaSource = new MediaSource();
const video = document.createElement('video');
try 
  video.srcObject = mediaSource;
 catch (error) 
  video.src = URL.createObjectURL(mediaSource);

【讨论】:

以上是关于视频 mediaDevices 将 Blob 分配给“videoRef.srcObject”以代替“src”的主要内容,如果未能解决你的问题,请参考以下文章

为什么navigator.mediaDevices在本地主机和服务器中的工作方式不同?

safari 13.1 navigator.mediaDevices.enumerateDevices()仅返回音频设备

JavaScript 使用 mediaDevices API 选择摄像头

navigator.mediaDevices.enumerateDevices() 仅返回 Safari 上的默认设备?

如何在使用 navigator.mediaDevices.getUserMedia 录制音频时修复广泛的回声?

如何将 blob 图像分配给 JLabel