当 url 是 blob url 时,html5 下载属性不起作用

Posted

技术标签:

【中文标题】当 url 是 blob url 时,html5 下载属性不起作用【英文标题】:html5 a download attribute doesn't work when the url is a blob url 【发布时间】:2017-09-20 21:44:13 【问题描述】:

我们正在创建一个 chrome 扩展来下载视频,目前我有这个功能:

function downloadvideo(video)

    const url = URL.createObjectURL(video.captureStream());
    const aelem = document.createElement('a');
    document.body.appendChild(aelem);
    aelem.setAttribute("href",url);
    aelem.setAttribute("download","video.mp4");
    aelem.click();
    //URL.revokeObjectURL(url);

这里的video 参数是一个html5 视频元素,我使用caputreStream 因为一些网站(尤其是youtube)使用明显被撤销的blob url 所以我从MediaStream 创建一个新的Blob url。

上述函数作为视频onloadeddata 事件的一部分执行。

显示对话框并且文件名正确,但是当我单击“保存”时,chrome 显示“失败:找不到文件”。

那么如何让它真正起作用呢?

顺便说一句,我尝试对 url 进行 ajax,但 chrome 拒绝了以下消息:“跨源仅支持方案 http、https、chrome、chrome-extension”:3。

【问题讨论】:

你能在新的视频标签中播放临时视频网址吗? @dandavis 不,我不能,控制台没有错误,新的视频标签是黑色空白,点击播放按钮没有任何作用(除了计时器增加但滑块没有幻灯片) 当你抓住它时它可能仍在加载,或者它被阻止并且根本无法工作...... @dandavis 好的抱歉,但它确实会播放,但只有在原始视频播放并且它只是跟随它时才会播放 @dandavis 并且音频听起来是重复的 :) 【参考方案1】:

URL.createObjectURL()

注意:使用 MediaStream 对象作为此方法的输入正在被弃用。关于是否应该彻底删除它的讨论正在进行中。因此,您应该尽量避免将此方法用于 MediaStreams,而应使用 HTMLMediaElement.srcObject()。

参考:https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL#Browser_compatibility

https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject#Browser_compatibility

代码:

功能下载视频(视频)

var mediaStream = video.captureStream();
//adding a dom element and fetching it in HTMLMediaElement.

HTMLMediaElement.srcObject = mediaStream;
var url = HTMLMediaElement.currentSrc;
const aelem = document.createElement('a');
document.body.appendChild(aelem);
aelem.setAttribute("href",url);
aelem.setAttribute("download","video.mp4");
aelem.click();
//URL.revokeObjectURL(url);

看看这是否适合你。

【讨论】:

对不起,没用,同样的事情,还是谢谢 :) 我看看有没有办法解决这个问题。【参考方案2】:

这是我用来下载我从画布帧捕获中存储的 bloburl 视频的功能

function createdVideo()
        var output = 'your video or captured stream or canvas capture'  
        var url = webkitURL.createObjectURL(output);
        // output_video.src = url; //toString converts it to a URL via Object URLs, falling back to DataURL
        download.href = url;//download is id of download link which als ohave download atribute

我希望对你有用

【讨论】:

我的功能和你的方案一样

以上是关于当 url 是 blob url 时,html5 下载属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Safari:无法从 blob url 动态加载视频

Safari:无法从 blob url 动态加载视频

Blob URL 是什么?

Blob URL 是什么?

如何从 Angular 6 中的 blob URL 下载音频文件?

如何从 blob url 读取数据?