让视频在 CefSharp 中循环播放

本文关键字:循环 播放 CefSharp 视频 | 更新日期: 2023-09-27 18:36:45

>有人能做到这一点吗? 我的代码如下所示:

    <video loop autoplay id="bgvid">
        <source src="/video/blueParticles.webm" type="video/webm">
    </video>

当我使用Chrome浏览时,它工作正常。 当我使用 cefclient 时.exe它工作正常。 但是,嵌入 ChromiumWebBrowser 控件并将其指向此网页不允许它循环。 它只播放一次。

让视频在 CefSharp 中循环播放

这个问题有点老了,但它仍然出现在谷歌搜索中,所以我想我会给它一个答案。请温柔一点,我不是专业的程序员,所以希望我的答案能被那些代码读起来不像XKCD卡通的人详细阐述或澄清。

首先,看看这个答案,它为我指出了HTML视频不会循环的正确方向 - 要点是,如果您在CEF应用程序中重载GetResponseHeaders,则必须非常小心地构建令人信服的虚假响应标头,否则视频将无法循环,从链接的问题和我自己的测试来看, CEF 中的循环视频需要状态响应 206(部分数据)而不是 200(正常)。

就我而言,我使用 CefShemeHandler 将视频链接重定向到 CEF 应用程序打包的本地视频文件。因此,我必须使用 GetResponseHeaders 构建自己的通用响应,以 200 OK 的状态进行响应(从这个问题中不清楚这是否是 OP 的确切情况,但即使它不是我的解决方案应该有效)。一切都很好,除了循环。当我意识到我需要用 206 回应时,这也意味着我需要添加一些额外的标题。

远远地,弄清楚 chromium 在成功的响应标头中期望什么的最简单方法是简单地将其加载到 Chrome 中(注意 OP 的声明,该页面在 chrome 中作为普通网页运行良好),打开控制台,单击"网络",然后单击视频文件的名称, 然后点击"标题"。现在,您可以确切地看到循环成功运行时使用了哪些响应和请求标头。

这里最重要的事情是,您会看到Chrome在每个循环上都启动了带有完整标头的请求/响应,即使它是从缓存中提取的!(您将在"网络"视图上看到除第一个循环之外的每个循环都显示"从缓存")。这意味着,您的 GetResponseHeaders 重载不仅必须在第一个循环中提供有意义的信息,而且还必须提供在每个循环中有意义的信息。

也许对http有更好理解的人可以确切地告诉我们标头的哪些部分绝对重要,但是由于我不确定,我只是欺骗了我在响应标头下看到的所有内容。就我而言,它看起来像这样——

  Accept-Ranges:bytes
Content-Length:4470009
Content-Range:bytes 0-4470008/4470009
Content-Type: video/webm .webm
Date:Thu, 23 Jun 2016 04:12:41 GMT
Etag:"****************"
Last-Modified:Fri, 06 May 2016 06:04:57 GMT

我认为对同一文件的所有请求上的 Etag 和上次修改日期必须相同,但我没有对此进行广泛测试。总的来说,一些测试使我相信重要的部分是内容范围和内容长度。为了获得总字节数,我简单地计算了文件中的字节数,将其用于 Content-Length 并使用"字节 0-(contentLength -1)/(contentLength)"作为范围似乎很简单。但是,这不起作用!

回到Chrome,我注意到在最初的请求之后,正如我在上面粘贴的那样,响应和请求开始看起来有点不同。在请求标头下,Range 第一次说"bytes=0-",之后每次(循环)都说"bytes=442-"。如您所料,在响应标头下,内容范围在循环中看起来也有所不同,它显示"字节 442-4470008/4470009",内容长度为 4469567,比总数少 442 字节。

因此,我只是简单地解析了 Request 标头上的 Range 字符串以找到起点,因此在我的示例中,第一个循环为 0,在循环的情况下为 442,并使用它来修改我的响应标头。Content-Range 变为 "bytes (startingPoint)-(contentLength -1)/(contentLength)",Content-Length 变为 contentLength - startingPoint。 之后,它循环良好 - 就像一个魅力,来自本地文件,没有间隙!