有人能这样做吗?我的代码如下所示:

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


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

最佳答案

这个问题有点老了,但它仍然出现在Google搜索中,因此我想给它一个答案。请放心,我不是专业的程序员,所以希望我的答案能被那些代码读起来不像XKCD卡通的人来阐述或阐明。

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

就我而言,我是使用CefShemeHandler将视频链接重定向到与CEF应用程序打包在一起的本地视频文件。因此,我必须使用GetResponseHeaders构建自己的通用响应,以200 OK的状态进行响应(这个问题尚不清楚OP是否确实适用,但即使不是我的解决方案也可以使用)。除循环外,其他一切正常。当我意识到需要用206响应时,这还意味着我需要添加一些额外的标头。

弄清铬在成功响应标头中的期望值,最简单的方法就是简单地将其加载到Chrome中(请注意OP声明该页面在chrome中可以正常工作),打开控制台,单击“网络”,然后单击视频文件的名称,然后单击“标题”。现在,您可以确切地看到在循环成功运行时使用了什么Response和Request标头。

这里最重要的是,即使从Cache中提取,Chrome也会在每个循环上启动带有完整标头的请求/响应! (对于第一个循环,您会在每个循环的“网络”视图上看到“ From Cache”)。这意味着,不仅您的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日期和Last-Modified日期必须相同,但是我并未对此进行广泛的测试。总体而言,一些测试使我相信重要的部分是“内容范围”和“内容长度”。为了获得字节总数,我只计算了文件中的字节数,将其用于Content-Length并将范围使用“ bytes 0-(contentLength -1)/(contentLength)”似乎很简单。但是,此操作无效!

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

因此,我只是解析了Request标头上的Range字符串以找到起点,因此在我的示例中,对于第一个循环,它为0,对于循环为442,然后使用它来修改我的响应标头。 Content-Range变为“字节(startingPoint)-(contentLength -1)/(contentLength)”,而Content-Length变为contentLength -startingPoint。之后,它可以循环播放-就像一个魅力文件一样,来自本地文件,没有任何间隙!

关于c# - 使视频在CefSharp中循环播放,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27850154/

10-17 01:15