我正在尝试开发一个小应用程序,我首先通过aperture
包捕获屏幕,然后尝试使用video
标记在屏幕上显示它。
我通过以下方式捕获屏幕:
import apertureConstructor from 'aperture';
const aperture = apertureConstructor();
const options = {
fps: 30
};
(async () => {
await aperture.startRecording(options);
setTimeout(async () => {
this.captureUrl = await aperture.stopRecording();
}, 3000)
})();
Aperture
包将捕获的视频写入磁盘,最终,我在captureUrl
中找到了此文件的路径。/var/folders/29/08gshk3n4mlbbcjnm1m5xyy40000gp/T/tmp-79999m0uOszQK0zaC.mp4
我可以验证此文件是否存在并且播放正常,如果我键入:file:///var/folders/29/08gshk3n4mlbbcjnm1m5xyy40000gp/T/tmp-79999m0uOszQK0zaC.mp4
到谷歌浏览器地址栏。
因此,我尝试使用此地址作为video
标记的源,如下所示:
<video control autoplay>
<source src="/var/folders/29/08gshk3n4mlbbcjnm1m5xyy40000gp/T/tmp-8004145a2o4gugbVV.mp4" type="video/mp4">
</video>
它抱怨文件不存在(404):
GET http://localhost:9080/var/folders/29/08gshk3n4mlbbcjnm1m5xyy40000gp/T/tmp-8004145a2o4gugbVV.mp4 404 (Not Found)
是的,它确实尝试转到localhost:9080
,因为在本例中,它是我的开发服务器主机,没有这样的文件。
所以我决定添加file://
...
<video controls autoplay>
<source src="file:///var/folders/29/08gshk3n4mlbbcjnm1m5xyy40000gp/T/tmp-8004145a2o4gugbVV.mp4" type="video/mp4">
</video>
这一次它说:
Not allowed to load local resource: file:///var/folders/29/08gshk3n4mlbbcjnm1m5xyy40000gp/T/tmp-80041e3SlBZUNphLM.mp4
:/
我想知道我是否错过了一些使“file://”安全的东西或其他东西。
我也想过通过“fs”阅读整个文件,并将其作为data:
提供视频,但由于此视频文件可能很大,我觉得我不应该这样做。
由于我是electron
的新手,我希望我错过了一些基本的东西。任何帮助都很感激。谢谢!
3条答案
按热度按时间gkl3eglg1#
既然已经有了一个公认的答案,我就告诉你我是如何为可能遇到同样问题的人解决这个问题的。
目前,有一种方法可以通过使用protocol来完成此操作,即使您指定
通常要显示图像或播放文件中的视频,您会执行以下操作
但这对webpack不起作用,因为webpack会生成一个服务器,默认情况下,基于安全原因,以
file://
开头的所有内容都不会被加载。如果电子版是用file://index.html
加载的,那么它可能会起作用,但protocol的方式非常酷,你可以保护你的资源。要克服您的问题,您可以采取以下措施:
然后,您可以在HTML代码中使用它,如下所示
通过这样做,你可以确保你的应用程序是安全的,它不是从文件系统中请求随机文件,它也与webpack一起工作得很好。
关于这方面的更多信息,有一个github repo来展示电子安全模式。
4smxwvx52#
我最近遇到了同样的问题。你可以设置(在主进程中):
这将允许你从用户的硬盘加载
file://
的网址。然而,这是一个非常糟糕的做法,因为它打开了安全。公认的办法是:
然后,从主进程创建一个Web服务器来提供所需的文件。
在您的主进程中:
然后执行下列程式码:
现在,在呈现器代码的js/html中,可以将video标记中的
src
设置为:zqry0prt3#
尽管我不喜欢鼓励这样做,但我还是建议您在BrowserWindow中禁用Web安全首选项,以解决问题。此外,还有一个与此主题相关的issue。