JavaFx Webview 未在本地主机服务器上加载 html5 视频

JavaFx Webview not loading html5 video on localhost server

我设法 运行 简单的 JavaFx Webview 应用程序在本地主机 运行 上呈现一个 html 文件 运行 在嵌入式码头容器中使用的微服务 Spark web framework我的问题是 JavaFx Webview 在使用 chrome 时无法识别 html5 视频标签的视频文件源,即,页面完美呈现并且视频文件正在运行的其他主要浏览器。

我现在不知道这是一个错误还是我搞砸了什么。

这是我的问题的工作快照:

工作区文件输出:

Workspace/Work-directory  
  .
    ├── public
    |   └── index.html
    |   └── video.mp4
    └── src
        └── main
        |   └── java
        |       └── com
        |           └── mycompany
        |               └── MainTest.java
        |               └── SparkTest.java
        └── pom.xml

依赖关系(pom.xml):

<dependency>
    <groupId>com.sparkjava</groupId>
    <artifactId>spark-core</artifactId>
    <version>2.5</version>
</dependency>

SparkTest.java

package com.mycompany;

import spark.Spark;

public class SparkTest {
    public static void main(String[] args) {
        Spark.staticFiles.externalLocation("public");
        Spark.get("/run", (request, response) -> "Spark is Runnig");
    }
}

MainTest.java

package com.mycompany;

import java.io.IOException;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class MainTest extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        StackPane root = new StackPane();
        WebView view = new WebView();
        view.getEngine().load("http://127.0.0.1:4567/index.html");
        root.getChildren().add(view);
        Scene scene = new Scene(root, 800, 600);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) throws IOException {
        Application.launch(args);
    }
}

index.html

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <h1>html5 video</h1>
        <video controls preload="auto" width="640" height="480">
            <source src="video.mp4" type='video/mp4'>
        </video>
    </body>
</html>

here you can find .mp4 video file

在我最后一条评论之后,我调试并尝试了更多,发现以下内容:

WebView 浏览器尝试使用 range http header 从 spark 加载文件,以分块加载;从 spark 服务器日志中我可以看到以下请求:

GET //127.0.0.1:4567/big_buck_bunny.mp4 
Host: 127.0.0.1:    
X-Playback-Session-Id: 1178DCF3-69C3-4A8E-B5F6-4FD24AD3F421 
Range: bytes=0-1 
Accept: */* 
User-Agent: AppleCoreMedia/1.0.0.15G31 (Macintosh; U; Intel Mac OS X 10_11_6; de_de) 
Accept-Language: de-de
Accept-Encoding: identity 
Connection: keep-alive

Spark 目前不支持对大文件使用 header 范围,open issue 关于该缺失的功能。

所以你没有弄乱什么,这只是 spark 缺少的一个功能,再加上 WebView 不会将整个文件加载到一个文件中,我想这是因为数据是通过网络提供的媒体。

Sp 您最好的解决方案可能是寻找不同的服务器来为您的媒体提供服务。或者尝试通过贡献或询问 Per Wendel 是否可以集成此功能来使此功能成为火花。

解决方法:

我使用了 jooby 另一个使用 Netty 网络应用程序作为 Web 服务器的微型 Web 框架,<video> 标签与 JavaFx Webview 完美配合。

工作区布局和文件相同除了你需要删除SparkTest.java并编辑pom.xml

Jooby/Netty (pom.xml) 的依赖项:

<dependency>
    <groupId>org.jooby</groupId>
    <artifactId>jooby</artifactId>
    <version>1.0.0.CR7</version>
</dependency>

<dependency>
    <groupId>org.jooby</groupId>
    <artifactId>jooby-netty</artifactId>
    <version>1.0.0.CR7</version>
</dependency>

JoobyTest.java

package com.mycompany;

import org.jooby.Jooby;

public class JoobyTest extends Jooby {
    {
        assets("/**");
    }

    public static void main(final String[] args) throws Throwable {
        run(JoobyTest::new, args);
    }
}