有没有办法使用 Three.js LoadingManager 加载视频?

Is there a way to load videos using Three.js LoadingManager?

我将 THREE.LoadingManager 与多个加载程序一起使用,以在显示我的应用程序之前管理纹理、模型、图像和立方体纹理的加载。
这允许我显示一个显示全局加载进度的加载栏,它工作得很好:

const loadingManager = new LoadingManager();
// ...
smaaImageLoader = new SMAAImageLoader(loadingManager);
textureLoader = new TextureLoader(loadingManager);
gltfLoader = new GLTFLoader(loadingManager);
cubeTextureLoader = new CubeTextureLoader(loadingManager);

但我很难以这种方式加载视频。 我希望有一个我可以这样使用的视频加载器:

videoLoader = new VideoLoader(loadingManager); // Can't do that

如果加载视频的唯一方法是在 javascript 中“手动”加载视频,有什么方法可以让我与 loadingManager 沟通视频处于待处理状态,然后加载?

谢谢

Is there a way to load videos using Three.js LoadingManager?

不,这是不可能的。但是,您可以这样做:

const video = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'video' );
video.addEventListener( 'loadedmetadata', onVideoLoad, false );

video.src = url;
video.preload = "auto";

video.setAttribute( 'webkit-playsinline', 'webkit-playsinline' );
video.setAttribute( 'playsinline', '' );

manager.itemStart( url ); // notifying about start of loading process

function onVideoLoad() {

    video.removeEventListener( 'loadedmetadata', onVideoLoad, false );
    manager.itemEnd( url ); // notifying about end of loading process

}

由于多种原因,实现加载程序存在问题:

  • 与图片相比,并非所有浏览器都支持某些格式,如 OGG。通过 HTML 定义多个来源比使用具有潜在 VideoLoader 的固定 URL 更灵活。这将需要在从后端加载视频之前进行功能检查。
  • 视频元素的属性和配置设置可能因用例而异,例如(静音、循环等)。在这种情况下,图像更简单。因此,在视频加载器中执行此操作是有问题的。
  • 项目可能更喜欢 canplaycanplaythrough 之类的事件而不是 loadedmetadata。大多数情况下不建议下载完整视频。