草庐IT

javascript - 具有循环功能的 <video> 元素不会在 Chrome 或 Firefox 中无缝循环播放视频

coder 2023-08-04 原文

<video width="640" height="360" src="http://jakelauer.com/fireplace.mp4" autoplay loop muted/>

在这里 fiddle :http://jsfiddle.net/bWqVf/

IE9 在这方面做得不错。有什么方法可以克服这个问题吗?在像这样的视频中,很明显应该无缝循环,但有令人讨厌的跳过/暂停。

编辑: 如您所见,如果我使用 javascript 来模拟循环,则会出现可测量的延迟:http://jsfiddle.net/bWqVf/13/

最佳答案

问题似乎与 Chrome 和 FF 填充预加载缓冲区的方式有关。在这两种情况下,他们似乎都忽略了循环标志并从开始“重置”缓冲区,这意味着在这种情况下,最后缓冲区被清空并在视频开始时再次预加载导致轻微的延迟/跳跃。

IE 似乎考虑了循环标志并继续填充到最后。

这意味着很难使它看起来无缝。我在几个小时内尝试了几种技术,包括将第一帧预缓存到 15 帧的屏幕外 Canvas 。我能做到的最接近无缝的是将视频修改为在其中包含两个片段(我没有(不再)有能力的硬件,所以我需要减小尺寸并进行测试 - 请参阅 fiddle )。

但是,这里也有缺点:

  • 视频是双倍长度
  • 您需要同时玩两个实例
  • 同一视频发生两次下载
  • 滞后补偿因计算机而异
  • future 的浏览器更新会影响最终结果的好坏。

换句话说,没有稳定的解决方案可以解决这些浏览器的问题。

我建议对上面提到的内容进行扩展,以预循环某些片段。这样您就可以减少故障。

但是,要在这里分享我所做的事情。

首先,我用一个额外的片段扩展了视频(并减小了尺寸以便在我的计算机上运行它):

然后我用下面的代码做了一个重叠循环。即:

  • 我同时开始播放视频,但从中间播放一个视频。
  • 显示当前 => 中间的视频
  • 我使用 Canvas 元素将视频绘制到
  • 当结束时切换当前视频,使新视频仍然是从中间开始播放的视频

这里的理论是,这将掩盖您在开始时遇到的故障,因为视频播放始终在中间(从第二段开始)。

代码如下所示:

由于视频是异步加载的,因此我们需要计算加载量,因为此技术使用两个视频实例并且浏览器似乎无法共享下载。

我们还为视频 1 设置了一个新位置,使其位于中间。当视频移动并准备就绪时,会为此引发一个事件,因此我们从那一点开始一切:

v1.addEventListener('canplay', init, false);
v2.addEventListener('canplay', init, false);
v1.addEventListener('timeupdate', go, false);

处理程序:

function init() {
    count--; /// = 2
    /// both videos are loaded, prep:
    if (count === 0) {
        length = v1.duration;
        mid = length * 0.5;
        current = mid;

        /// set first video's start to middle
        v1.currentTime = mid + lag;
    }
}

function go() {
    /// remove listener or this will be called for each "frame"
    v1.removeEventListener('timeupdate', go, false);
    v1.play();
    v2.play();
    draw();
}

lag 值试图补偿两个视频开始之间的差异,因为它们不在完全相同的时间开始。

主代码 draw 只是根据主视频 (v1) 的位置在视频之间切换 - 帧速率也降低到 30 fps 以减少开销drawImage 作为 requestAnimationFrame 的最佳运行速度为 60 fps(这里的视频是 30 fps,所以我们只需要每隔一段时间绘制一帧):

function draw() {

    /// reduce frame-rate from 60 to 30        
    if (reduce === true) {
        reduce = false;
        requestAnimationFrame(draw);
        return;
    } else {
        reduce = true;
    }

    /// use video that is >= middle time
    var v = v1.currentTime >= mid ? v1 : v2;

    /// draw video frame onto canvas
    ctx.drawImage(v, 0, 0);

    requestAnimationFrame(draw);
}

现在,使用 Canvas 还开辟了其他可能性,例如在两个视频之间制作交叉淡入淡出以进一步平滑过渡。我没有实现它,因为它超出了范围(在大小/广度方面),但值得一提,因为它本身就是一个解决方案。

无论如何 - 如前所述,这是一个有很多缺点的解决方案,但它是我能找到的最接近于减少故障的解决方案(使用 Chrome)。

唯一可以正常工作的解决方案是内部浏览器驱动的解决方案,因为您需要访问缓冲区才能完全无缝地执行此操作。

我的“解决方案”本质上是在说:算了吧!它在这些浏览器中不起作用,请改用重复循环的视频。 :-)

关于javascript - 具有循环功能的 <video> 元素不会在 Chrome 或 Firefox 中无缝循环播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17930964/

有关javascript - 具有循环功能的 <video> 元素不会在 Chrome 或 Firefox 中无缝循环播放视频的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  7. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  8. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  9. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  10. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

随机推荐