javascript - 如何正确处理切换 html5 视频

标签 javascript python html flask gridfs

我在遇到可能仅与视频相关的问题之后遇到了很多麻烦,并且可能对一般的页面资源理解不佳。我想要完成的是拥有一个网页的能力,通过单击“前进”和“后退”按钮,可以更改 div 的内容以按明显的顺序显示其中一个视频。该视频当前为 html5 视频元素中的 mp4 格式。

我试过几种方法。

  • 直接改变源元素的src(好像什么都没做)

  • 删除该元素,并使用不同的 src 重新添加它。 (有下面描述的问题)

  • 删除该元素,并使用 Jquery .load() 放置一个包含整个视频元素的外部 html 文件,包括每个 src 的单独 html 文件。 (有下面描述的问题)

  • 删除该元素,并使用指向使用 python flask 框架从 GridFS 下载文件的 src 重新添加它。 (有下面描述的问题)

好的,我遇到的主要问题是从页面重复下载同一视频。假设您点击“下一个视频”,然后点击“上一个视频”。这会导致视频“变黑”(根本没有加载,就像 src 损坏一样)。第一次请求每个视频时,加载时间不到一秒,第二次时有所不同,但总是超过 10 秒。在视频内容弹出并且可以播放之前。谷歌浏览器的开发网络工具在我等待时将媒体列为“待处理”,当它完成等待时,它最终将上述视频变为红色(已取消)并将新来源变为“部分内容”。在等待期间,它似乎无法从服务器中提取任何内容,包括翻转图像。

我已经在本地使用 flask 和 python 简单 html 服务器以及通过千兆以太网的 8 核服务器上进行了尝试。这不是随机网络延迟的问题,而是发生了一些奇怪的事情。

我想弄清楚的事情之一是向服务器发出新请求如何处理部分内容。我有一些想法,浏览器缓存会存储文件,以便第二次加载它应该更快,无论如何这都是最佳的。 html5 视频还会发生这种情况吗?

另外值得注意的是,这些文件相当小,一分钟左右的视频大约 20 MB。似乎网络服务器出于某种原因只是阻止了第二个请求,我想知道你们中是否有人听说过这个。我可以根据要求发布代码,但我认为这个概念非常简单。

我打算使用GridFS和flask来完成这个站点的最终实现。

由于以下建议,我尝试取消源元素并将 src 属性附加到视频本身。这会产生相同的结果。这是我正在做的相当简单的事情:

$('#addlinks').click(function(){

    $('#maininside').remove();
    $('#maintext').append('<div id=maininside></div>');        
    $('#maininside').html('<video width="100%" controls src="/getmedia/dangerisland-01-video-01.m4v">Your browser does not support the video tag.</video>');

});

<article id="maintext">            

        <div id="maininside">            

        </div>       

</article>

第一次单击该按钮时,会有非常轻微的延迟,我可以在下载视频时在监视器中看到高网络使用率。再次单击该按钮后,在这种情况下,我有大约 30 秒没有使用网络,然后它再次全速下载并恢复。这是第二次恢复后网络使用的开发 View :

A failed download in Chrome's network tab, showing as cancelled

感谢您提供的任何见解。

最佳答案

这里有很多子问题和变数;不确定我能多好地解决所有这些问题——但我会试一试。

  • kalhartt 的评论引导您更正关于简单 改变来源。但我会注意到,根据我的经验,行为 当你完成这个过程时,你会从各种浏览器中看到 会不一致。在过去的一年里,我在这方面做了一些工作, 至少在当时这是一种糟糕的用户体验——当浏览器响应源和新版本的变化时,用户体验到视频被破坏了 加载。我们最终生成了新的视频元素并将它们切换出去(但由于每个浏览器发布媒体事件的时间不同,即使这样也可能充满陷阱。)

  • 我不确定你是如何提供视频的,但 flask 开发服务器阻塞(除非你设置 app.run(threaded=True),我想。)

  • 也有可能你正在运行 由内部视频加载/缓存逻辑引起的行为 浏览器,您甚至会观察到每个浏览器的显着差异 浏览器处理这些任务。测试的好方法 反对这种行为的方法是附加一个唯一的查询字符串 (可能带有时间戳)每次加载;视频应该很高兴 负载(如果服务器未阻塞。)如果服务器阻塞是问题所在,则可能值得在 S3 上托管视频,直到您准备好专注于它们的交付方式。

  • 另一种可能性是,如果您怀疑要再次使用原始视频对象,则不要销毁它(相反,您可以暂停它,将其从 DOM 中删除,并保存对它的引用)。但是,如果重复使用的情况不太可能发生,尤其是如果您希望用户在一次加载页面时播放多个视频,则最好丢弃它们。妥协可能是保留固定数量的以前的视频对象。

关于javascript - 如何正确处理切换 html5 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20917601/

相关文章:

javascript - 如何将接收到的八位字节流作为 REST 响应保存到文件系统?

javascript - 为什么 jQuery 仅在加载停止时才加载?

python - 将深度优先算法从递归更改为迭代

html - inline-flex div 的宽度是如何决定的?

javascript - AngularJS:如何将服务方法分配给 View 中的 Controller $scope 和 ng-repeat (it)?

javascript - 如何与 Grammarly 集成

python - 使用 python 中的 hypopt 包在 GridSearch 函数中指定评分指标

python - 向 scapy 添加新协议(protocol)(类似于 ARP)

javascript - 如何使用 JavaScript 来计算整个 HTML 网页中某个单词的出现次数,而不是仅在数组中出现的次数?

html - NetSuite 高级 PDF 外语