- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 blob:https 作为我的视频标签的来源,如下所示:
function mk_bloburl(source_id, url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob'; //important
xhr.onload = function(e) {
if (this.status == 200) {
var blob = this.response;
var source = document.getElementById(source_id);
var video = source;
if (video.tagName=="SOURCE") {
video = source.parentNode;
}
video.oncanplaythrough = function() {
URL.revokeObjectURL(source.src);
};
source.src = URL.createObjectURL(blob);
video.load();
}
};
xhr.send();
}
mk_bloburl('review-video-source', my_video_url );
有这样的 HTML:
<video id="review-video" controls="" width="100%">
<source id="review-video-source" />
</video>
现在,如果我重新加载页面并开始播放,它就可以工作了。如果我播放并让它播放完然后重播,无需等待时间,它就可以工作。但是,如果我重新加载页面,然后等待一段时间(例如 1-2 分钟),然后按播放,则会失败。
我在 Chrome 浏览器中收到的消息如下所示:
GET blob:https://example.com/debeecfe-49b0-4c98-87d6-8ead325b2d75 404 (Not Found)
因此,就像该 blob 会在一段时间后从浏览器内存中自动删除一样。我想在它被删除时或者当我通过开始播放得到 404 时捕获该事件,这样我就可以刷新 blob。
我已经尝试过:
var source = document.querySelector("#review-video-source");
source.addEventListener("error", function(event) {
console.debug("An error accoured");
});
但这似乎没有捕获错误。我能做什么?
最佳答案
您的主要问题是由您撤销 canplaythrough
中的 blobURI 引起的事件。
canplaythrough
事件只是浏览器发送的一个通知,让我们知道它认为它将能够不间断地加载和播放整个媒体;这并不意味着它已经加载了所有内容。
对于 BlobURI,连接速度非常快(来自内存),浏览器可能认为它能够瞬间获取 4k 的《星球大战》传奇故事。
因此,您很早就收到了这个 canplaythrough
事件,但浏览器实际上尚未解压缩所有数据。尽管如此,您还是撤销了 BlobURI,当浏览器再次尝试获取数据以便解压缩并读取数据时,BlobURI 指针的末尾不再有任何内容。
因此,对于您的问题,您有两种解决方案:
如果您需要仅播放媒体一次:
在 ended
中调用 URL.revokeObjectURL(blobURI)
事件。这将在视频的 currentTime 第一次到达结尾时触发。
如果您需要多次播放视频:
撤销 beforeunload
中的 blobURI页面的事件。这样,只要页面处于事件状态,您的 BlobURI 指针就始终处于事件状态,但不会在内存中阻塞整个 Blob 的时间超过页面生命周期(如果您根本不撤销 BlobURI,就会发生这种情况)。
关于如何在视频 blob:https 源上检测 404,我真的不知道有什么好方法,除了监听意外跳转到末尾,但这不应该是需要的无论如何都是 blobURI。
关于javascript - 在视频 blob :https source 上检测到 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724195/
这些指针之间有区别吗?每次通话到底发生了什么。 *p++ (*p)++, *(p)++ 最佳答案 1和3是一样的。 请记住 ++ 的后缀和一元形式。和 --有一个结果和一个副作用: x++ 的结果是
这个问题已经有答案了: difference between grep Vs cat and grep (5 个回答) 已关闭 8 年前。 我看到一个例子,其中有人这样做: cat source.tx
它曾经有效。现在,当我添加一个断点时: saveSnippet: (title, imageUrl, role) => { debugger; ... chrome (
开发.Net Web应用程序时,如果生成运行时错误,则会显示一些在Exception类中找不到的“额外”调试信息。 它显示了“源错误”部分,其中显示了代码摘录,其中行号准确显示了错误的产生位置,并显示
Firefox 中的“源”和“生成的源”有什么区别? 请举例说明。 编辑: 7 月 3 日 “搜索引擎”使用哪个来源,生成的还是生成前的? 最佳答案 Source 将显示页面加载的源(由服务器提供)。
对于具有两个不同工作表的Excel文件,我有两个OLE DB源。工作表A和工作表B。工作表A单元格I6包含日期,我想组合这两个源并在工作表B中添加一列,以将该值设置为工作表A的日期值。有可能做到吗?任
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这是我的代码: import speech_recognition as sr r = sr.Recognizer() with sr.Microphone() as source: prin
我是 mysql 新手。我正在尝试 setter 工示例数据库 我尝试了 stackoverflow 中提到的一些方法,但没有帮助 谁能告诉我如何解决这个问题 SELECT 'LOADING depa
在终端中,我启动程序如下: 1) source env.sh 2) source activate enviroment 3) program --args 除了在 Pycharm 中并调试代码之外,
IntelliJ 如何知道目录是“源”还是“测试源”?如何始终将目录标记为“测试源”? build.gradle 1 apply plugin: 'java' apply plugin: 'idea'
这个问题类似于Source script to separate environment in R, not the global environment , 但有一个关键的转折。 考虑一个源另一个脚
和有什么区别--devtool source-map & eval-source-map ? 最佳答案 webpack 文档有一个方便的图表,说明这些不同的选项可能适合哪些情况。 他们显示eval-s
这个问题已经有答案了: Issue with virtualenv - cannot activate (36 个回答) 已关闭 4 年前。 venv) C:\Users\Sunil\PycharmP
在以前版本的 Akka Streams 中,groupBy 返回一个 Source 的 Source 可以具体化为一个 Source[Seq [A]]. 在 Akka Streams 2.4 中,我看
这个问题已经有答案了: Issue with virtualenv - cannot activate (36 个回答) 已关闭 4 年前。 venv) C:\Users\Sunil\PycharmP
是否可以获取 Bash 片段的源代码,但仅在特定条件成立时才实际提供其中的函数? 所以我要问的是,我可以无条件地获取目录中的所有文件,但获取的文件包含是否向采购外壳提供功能的逻辑。 例子: .bash
我无法查看 JavaCore.class 源代码,但我可以很好地使用代码。 例如,要查看方法JavaCore.create(..) 的源代码,我ctrl - click(或按f3) 在 JavaCor
-- Sample employee database -- See changelog table for details -- Copyright (C) 2007,2008, MySQL
当我在我的 IDE 中编译项目时它工作正常但是当我在 bamboo 中编译时它给我以下错误。 我已经检查过我在任务中配置的 jdk 版本是 1.6,我还尝试从 pom 中的 maven 插件强制执行
我是一名优秀的程序员,十分优秀!