在Safari中显示下面错误。

对'URL'执行'createObjectURL'失败:没有找到与提供的签名匹配的函数。

我的代码是:

function createObjectURL(object) {
    return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object);
}

这是我的图像代码:

function myUploadOnChangeFunction() { 
    if (this.files.length) { 
       for (var i in this.files) { 
           if (this.files.hasOwnProperty(i)) { 
              var src = createObjectURL(this.files[i]); 
              var image = new Image(); 
              image.src = src; 
              imagSRC = src; 
              $('#img').attr('src', src); 
            }
       }           
   } 
} 

我经历了同样的错误,当我传递原始数据createObjectURL:

window.URL.createObjectURL(data)

它必须是一个Blob、File或MediaSource对象,而不是数据本身。这招对我很管用:

var binaryData = [];
binaryData.push(data);
window.URL.createObjectURL(new Blob(binaryData, {type: "application/zip"}))

更多信息请查看MDN: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL


更新

过去,我们还可以对MediaStream对象使用createObjectURL()方法。这种用法已经被规范和浏览器抛弃了。 如果你需要设置一个MediaStream作为HTMLMediaElement的源,只需将MediaStream对象直接附加到HTMLMediaElement的srcObject属性上,例如<video>元素。

const mediaStream = new MediaStream();
const video = document.getElementById('video-player');
video.srcObject = mediaStream;

然而,如果你需要使用MediaSource, Blob或File,你仍然需要使用URL. createobjecturl()创建一个Blob:// URL,并将其分配给HTMLMediaElement.src。

更多详情请点击:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject


问题在于循环中提供的键并不指向文件的索引。

for (var i in this.files) {
    console.log(i);
}

上述代码的输出是:

0
length
item

但人们所期望的是:

0
1
2
etc...

然后在浏览器试图执行时出现错误,例如:

window.URL.createObjectURL(this.files["length"])

我建议基于以下代码实现:

var files = this.files;
for (var i = 0; i < files.length; i++) {
    var file = files[i],
        src = (window.URL || window.webkitURL).createObjectURL(file);
    ...
}

我希望这能帮助到一些人。

问候!


我在MediaStream上也有同样的错误。解决方案是将一个流设置为srcObject。

从文档中可以看出:

重要:如果您仍然有代码依赖createObjectURL()来实现 附加流到媒体元素,您需要更新您的代码 简单地将srcObject直接设置为MediaStream。


此错误是因为createObjectURL函数不再接受谷歌Chrome的媒体流对象

我改了这个:

video.src=vendorUrl.createObjectURL(stream);
video.play();

:

video.srcObject=stream;
video.play();

这对我很管用。


视频与回落:

try {
  video.srcObject = mediaSource;
} catch (error) {
  video.src = URL.createObjectURL(mediaSource);
}
video.play();

来自: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject


我下载了最新的版本 GitHub


我的代码被破坏了,因为我使用了一种过时的技术。以前是这样的:

video.src = window.URL.createObjectURL(localMediaStream);
video.play();

然后我把它换成了这个:

video.srcObject = localMediaStream;
video.play();

效果很好。

编辑:最近localMediaStream已弃用并被MediaStream取代。最新的代码是这样的:

video.srcObject = new MediaStream();

引用:

已弃用的技术:https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL 现已弃用的技术:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject 现代技术:https://developer.mozilla.org/en-US/docs/Web/API/MediaStream


如果你正在使用ajax,可以添加选项xhrFields: {responseType: 'blob'}:

$.ajax({
  url: 'yourURL',
  type: 'POST',
  data: yourData,
  xhrFields: { responseType: 'blob' },
  success: function (data, textStatus, jqXHR) {
    let src = window.URL.createObjectURL(data);
  }
});

如果你正在使用angular,本教程将会很有帮助:link。但是你需要替换这一行:

this.video.src = window.URL.createObjectURL(stream);

因为createObjectURL()在MediaStream的chrome上已弃用。

this.video.srcObject = stream;

我尝试了一些东西,但对我来说,简单地分配流到src工作。

video.srcObject=stream;

//my code was:

this._videoEl = videoEl;
        navigator.mediaDevices.getUserMedia({
            video : true
        }).then(stream => {
            this._videoEl.src = URL.createObjectURL(stream);
            this._videoEl.play();
        }).catch(err => {
            console.log(err);
        });

//and replace to this worked for me :

this._videoEl = videoEl;
        navigator.mediaDevices.getUserMedia({
            video : true
        }).then(stream => {
            this._videoEl.srcObject = stream;
            this._videoEl.play();
        }).catch(err => {
            console.log(err);
        });

我可以通过检查对象是否为空来修复这个问题。 {对象?URL.createObjectURL(对象):"default.png"}

这使我得出结论,错误发生时,对象为空。