html5 chrome视频播放获取EofException,

时间:2018-02-20 13:41:44

标签: html5 google-chrome jetty

我终于让视频播放工作在Chrome中,使用标题内容范围等寻找功能并返回状态206。它适用于较小的视频但不适用于大型视频。请注意,我没有明确发送实际的字节范围,而是将整个流传送到Web服务器。我收到以下错误:

org.eclipse.jetty.io.EofException,

这发生在后端dataserver中,它为servlet提供整个输入流,jetty是正在使用的服务器。我不确定这个过程实际上是如何回放并纠正我需要的搜索功能,但现在视频在播放一段时间后失败了。浏览器调试器中也会出现以下错误:

ERR_CONTENT_LENGTH_MISMATCH

由于我不知道如何混合这两个流,因此我同时请求了一个音频流并进行了回放。

赞赏任何想法或建议。

编辑:

感谢您将resourcehandler更改为defaultservlet的建议;不知道在哪里这样做,所以在代码中找到了这个实例:

   private void addHttpContexts(ConfigNode cnode) throws Exception {

      try {
        // get all the http context nodes
        ConfigNode[] httpContextNodes = cnode.getChildNode("HttpContextList").getChildNodes();

        for (int s = 0; s < httpContextNodes.length; s++) {
            String urlPath = httpContextNodes[s].getChildNode("ContextPath").getStringValueEx();
            String resourceBase = httpContextNodes[s].getChildNode("ResourceBase").getStringValueEx();

            ArrayList<String> welcomeFileList = new ArrayList<String>();
            if (httpContextNodes[s].hasChildNode("WelcomeFile")) {
                String welcomeFile = httpContextNodes[s].getChildNode("WelcomeFile").getStringValueEx();
                welcomeFileList.add(welcomeFile);
            }

            ContextHandler context = new ContextHandler(contexts, urlPath);
            ResourceHandler resourceHandler = new ResourceHandler();
            resourceHandler.setResourceBase(resourceBase);
            resourceHandler.setWelcomeFiles((String[]) welcomeFileList.toArray(new String[welcomeFileList.size()]));

            context.setHandler(resourceHandler);


    } catch (Exception ex) {
        trace.warning("Configuration of http contexts failed", ex);

        throw ex;
    }
}

setResourceBase(resourceBase)和的适当方法是什么? setWelcomeFiles((String [])welcomeFileList.toArray(new String [welcomeFileList.size()]));

这是我发现DefaultSErvlet

的同一个类中的另一个地方
ServletHolder holderDefault = new ServletHolder("default",DefaultServlet.class);
                holderDefault.setInitParameter("dirAllowed","false");

并且已在web.xml中定义

 <servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
<init-param>
    <param-name>dirAllowed</param-name>
    <param-value>false</param-value>
</init-param>
</servlet>

1 个答案:

答案 0 :(得分:1)

默认情况下,Jetty的DefaultServlet将正确处理Jetty本身提供的静态内容的范围请求。

Jetty中没有其他组件可以自行处理范围请求。

如果您有自定义代码,自己的Servlet,自己的Jetty处理程序,REST端点,专用过滤器,spring-mvc设置等等,那么您必须自己处理范围请求。

这是因为网络服务器支持自定义代码非常不切实际。 (它必须从自定义代码请求整个内容,然后只将特定字节范围发送到请求客户端。)