在电子中播放本地mp4文件

2024-05-10

我正在尝试开发一个小应用程序,其中我首先通过以下方式捕获屏幕aperture包,然后尝试使用在屏幕上显示它video tag.

我通过以下方式捕获屏幕:

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到 Google Chrome 地址栏。

所以我尝试使用这个地址作为我的来源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”读取整个文件并对其进行 base64 处理,提供视频作为data:但由于这个视频文件可能很大,我觉得我不应该这样做。

由于我是新手electron我希望我错过了一些基本的东西。任何帮助表示赞赏。谢谢!


由于已经有一个公认的答案,我只会告诉你我是如何为可能遇到同样问题的人解决这个问题的。

这时候有一个方法可以使用protocol https://www.electronjs.org/docs/api/protocol,即使您指定

webPreferences: {
  webSecurity: true,
}

通常要显示图像或播放文件中的视频,您会执行以下操作

<video controls autoplay>
  <source src="file:///path-to-video.mp4">
</video>

但这不适用于 webpack,因为 webpack 会生成一个服务器,并且默认情况下以file://由于安全原因将不会被加载。如果电子负载有file://index.html那么它可能会起作用但是protocol https://www.electronjs.org/docs/api/protocol方式非常酷,您可以保护您的资源。

要解决您的问题,您可以执行以下操作:

const { protocol } = require('electron');

function fileHandler(req, callback){
  let requestedPath = req.url
  // Write some code to resolve path, calculate absolute path etc
  let check = // Write some code here to check if you should return the file to renderer process

  if (!check){
    callback({
      // -6 is FILE_NOT_FOUND
      // https://source.chromium.org/chromium/chromium/src/+/master:net/base/net_error_list.h
      error: -6 
    });
    return;
  }

  callback({
    path: requestedPath
  });
}

// Then in electron main.js

app.on("ready", () => {
  
  protocol.registerFileProtocol(
    'your-custom-protocol',
    fileHandler,
  );

  // Create some window you can even use webPreferences: true
});

然后你可以像这样在你的html代码中使用它

<video controls autoplay>
  <source src="your-custom-protocol:///path-to-video.mp4">
</video>

通过这样做,您可以确保您的应用程序是安全的,并且它不会从文件系统请求随机文件,并且它也可以很好地与 webpack 配合使用。

有关此内容的更多信息,有一个 github 存储库来展示电子中的安全模式。 看看它here https://github.com/reZach/secure-electron-template

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在电子中播放本地mp4文件 的相关文章

随机推荐

  • ui:decorate 和 ui:include 之间真正的概念区别是什么?

    发生在我之前ui decorate功能上与ui include除了你也可以通过ui param and ui define到包含的文件 我疯了吗 EDIT 虽然事实上你可以通过ui param to a ui include文件也一样 事实
  • 将 List 作为参数传递到 postgres 的函数中

    我有这样的 Spring 数据存储库接口 public interface MyEntityRepository extends JpaRepository
  • 在 Python IDLE 会话中显示用户定义函数的列表

    是否可以在 IDLE 会话中显示所有用户功能的列表 我可以看到它们在自动完成中弹出 所以也许还有其他方法可以只显示为会话定义的用户功能 当您忘记函数名称时 它很有用 而且当您想确保在会话关闭时不会丢失函数的源代码时 这应该为您提供全局范围内
  • 成功添加具有父引用的子实体后,子实体不会显示在父资源下

    我有两个实体 书架和书籍 一个书架可以有多本书 关系是双向的 我已将这两者公开为 JpaRepositories 问题是这样的 我通过将 name sci fi 发布到 shelves 来创建一个架子 成功 我通过将 name mybook
  • 更改 UITableView 中移动单元格的默认图标

    我需要更改 UITableView 中移动单元格的默认图标 这个 是否可以 这是一个非常棘手的解决方案 可能无法长期工作 但可能会给您一个起点 重新排序控制是UITableViewCellReorderControl 但这是一个私有类 因此
  • 如何使用扩展构建双重调度

    我有一个具有类层次结构的库 如下所示 class Base class A Base class B Base 现在我想根据对象的类型 无论是 A 还是 B 做不同的事情 所以我决定去实现双重调度以避免检查类型 class ClientOf
  • 如何从 PowerQuery/Excel 数据模型中具有多对多关系的两个表中选取数据?

    这是我第一次在 stackoverflow 上提问 让我们看看进展如何 我正在尝试将不同规模资产的场景管理器连接到其所属的成本时间序列 以便我可以计算属于特定场景的资产配置的现金流 这就是我需要连接的两个表 简而言之 的样子 场景管理器 S
  • 错误:“std::this_thread”尚未声明

    我尝试使用 std this thread sleep for 函数但收到错误 error std this thread has not been declared 包括标志 GLIBCXX USE NANOSLEEP 还需要什么来强制它
  • 排除 npm 包中的测试代码?

    The 开发依赖 https docs npmjs com files package json devdependenciesnpm 的 package json 文档的部分说要在那里列出您的测试依赖项 以便您的包的用户不必拉取额外的依赖
  • Jersey 将 Weld 托管 bean 注入 ConstraintValidator

    我已经花了几个小时寻找解决方案来解决我的问题 但我无法让它发挥作用 我想将 Weld 管理的服务注入 ConstraintValidator 中 该 ConstraintValidator 用于验证发布到 JAX RS Rest Servi
  • Popper.js:点击外部时如何关闭弹出窗口

    我在用着波普尔 js https popper js org 显示具有该类的弹出元素 js share cf popover单击带有类的元素时 js share cf btn 但我希望只有当我在弹出窗口之外单击时才关闭弹出窗口 这是我显示弹
  • c++ 12位变量,我该怎么做?

    我正在构建一个体素引擎 所以我担心内存使用情况 使用 12 位而不是 16 位块 ID 可以节省大量内存 我有一个 3D 块 id 数组 每个 id 都有一个静态配置 我不确定实现这一目标的好方法是什么 有没有一种方法可以获取一块原始内存并
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 导入属性始终为空(MEF 导入问题)

    我尝试了一段时间使用 MEF 来完成工作 但现在遇到了一个问题 我需要帮助 描述 我有 2 个 DLL 和 1 个 EXE 文件 ClassLibrary1 LoggerImpl cs SomeClass cs 类库2 ILogger cs
  • Unity Transform.LookAt 仅在一个轴上

    我一直在开发一款游戏 进展非常顺利 从这里得到了一些帮助 我再次需要它 所以我正在制作一个 2D 自上而下的射击游戏 我需要我的敌人看着玩家 显然敌人会在所有轴上旋转 因此是无敌的 或者看起来很奇怪 那么 如何让它只在Z轴上旋转呢 另外 如
  • Hibernate条件查询

    我正在尝试使用 Hibernate criteria api 执行子查询 但无法完全弄清楚如何执行它 假设有 2 个表 SHOPS 和 EMPLOYEES 其中 SHOPS 包含所有商店信息 EMPLOYEES 是所有商店中所有员工的大表
  • 为什么 FindWindow 找到了 EnumChildWindows 找不到的窗口?

    我正在寻找一个类名称为 CLIPBRDWNDCLASS 的窗口 它可以在办公应用程序和其他应用程序中找到 如果我使用 FindWindow 或 FindWindowEx 我找到第一个具有此类的 HWND 但我想要all具有该类的窗口 因此我
  • 在没有自动关闭标签的元素之前和之后插入内容

    假设我有以下内容 div content div 我想在它之前插入一些东西 注意未关闭的div content before div pre pre content div div pre content 之后还有一些 注意我现在正在关闭
  • Blazor 服务器端 Console.WriteLine 不起作用

    在服务器端 Blazor 应用程序上我发现Console WriteLine不起作用 为什么我在 Chrome 控制台中看不到该文本 code protected override async Task OnInitializedAsync
  • 在电子中播放本地mp4文件

    我正在尝试开发一个小应用程序 其中我首先通过以下方式捕获屏幕aperture包 然后尝试使用在屏幕上显示它video tag 我通过以下方式捕获屏幕 import apertureConstructor from aperture cons