javascript - 使用node.js fs.readStream()在electronic html5视频播放器中播放本地视频文件

标签 javascript node.js electron

我正在开发一个视频播放器应用程序,该应用程序使用node.js和electronic播放本地文件系统中的视频(.mp4)(因此,我使用的是chrome5的html5视频播放器)。

播放大于2GB的视频似乎是我目前使用的方法的问题。

我曾经使用fs.readFileSync读取本地视频文件,并将该Blob传递给视频播放器,如以下代码所示:

this.videoNode = document.querySelector('video');
const file: Buffer = fs.readFileSync(video.previewFilePath);
this.fileURL = URL.createObjectURL(new Blob([file]));
this.videoNode.src = this.fileURL;

这对于小于2GB的视频文件确实适用。大于2GB的文件会触发以下错误:
ERROR RangeError [ERR_FS_FILE_TOO_LARGE]: File size (2164262704) is greater than possible Buffer: 2147483647 bytes
    at tryCreateBuffer (fs.js:328)
    at Object.readFileSync (fs.js:364)
    at Object.fs.readFileSync (electron/js2c/asar.js:597)

我相信解决方案是使用fs.readStream()将ReadStream传递给html5视频播放器。不幸的是,我找不到任何有关如何将此流传递到视频播放器的文档。

最佳答案

正如主题所述,您正在使用 Electron ,从以上评论可以明显看出,您正在避开服务器。看来,如果您只是创建一个脱机视频播放器,那么您会使事情变得复杂。为什么要创建一个缓冲区然后创建一个新的URL?您可以通过简单地获取视频路径并将其用作视频对象的src属性来实现此目的。
您的代码应如下所示-

var path="path/to/video.mp4"; //you can get it by simple input tag with type=file or using electron dialogs
this.videoNode = document.querySelector('video');//it should be a video element in your html
this.videoNode.src=path;
this.videoNode.oncanplay=()=>{
  //do something...
}
这将处理完整的文件,并且鉴于videoNode是html文件中的video元素,因此您无需禁用webPreference。
您可以看一下使用electronic-
https://github.com/HemantKumar01/ElectronMediaPlayer
免责声明:我是上述项目的所有者,并邀请每个人都为该项目做出贡献

关于javascript - 使用node.js fs.readStream()在electronic html5视频播放器中播放本地视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57009575/

相关文章:

javascript - Angular 6 属性绑定(bind)在多级对象上无法正常工作

javascript - 无法从私有(private)方法访问公共(public)方法

javascript - webdriverio waitUntil 和 getUrl 与模式

javascript - 已声明使用 Node.js ('bucketName' 将文件上传到 Google Cloud Storage)

javascript - 如何自动化 ElectronJS 应用程序

javascript - Electron 应用程序中的 Angular2 错误 : No Provider for PlatformRef

javascript - 酒窝刻度格式忽略分组逗号

javascript - 使用history.push重置useState

node.js - 在 Node.js 中解析数据

node.js - 如何在Electron的MacOS菜单栏的右侧添加图标?