- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是进口的 ffmpeg
二进制 ffmpeg-static-electron
在 Electron-React 应用程序(在 Windows Pro 10 上)中,想要删除保存的裁剪视频,然后从我的 Main process
中终止子进程.
总体目标是在捕获后裁剪整个屏幕的视频,然后将裁剪后的视频发送到渲染器。
const fsPromises = require('fs').promises
const ffmpeg = require('ffmpeg-static-electron')
const { execFile } = require("child_process")
ipcMain.on("windoze_capture_screen:video_buffer", async (event, buffer) => {
const temp_directory = await fsPromises.mkdtemp(await fsPromises.realpath(os.tmpdir()) + path.sep)
const capture_screen_video_path = path.join(temp_directory, "screen_capture_video.mp4")
child_object = execFile(`${ffmpeg.path}`,
['-i', `${capture_screen_video_path}`, '-vf', `crop=${width}:${height}:${x_pos}:${y_pos}`, `${path.join(temp_directory,'cropped_video.mp4')}`])
child_object.on("exit", async () => {
// child_object.kill()
console.log("?Killed -1", child_object.killed)
try {
databasePayload.video_buffer = await fsPromises.readFile(path.join(temp_directory, "cropped_video.mp4"), {encoding: 'base64'})
mainWindow.webContents.send("main_process:video_buffer", databasePayload.video_buffer)
} catch (error) {
console.log(error)
} finally {
// child_object.kill()
console.log("?Killed - 2", child_object.killed)
// noASAR required to be set to 'true' in order to remove temp directory in build
process.noAsar = true
fs.rmdir(temp_directory, {recursive: true}, (error) => {if (error) {log(error)}})
process.noASAR = false
}
// 3rd scenario
// child_object.kill()
console.log("?Killed -3", child_object.killed)
})
// 4th scenario
console.log("?Killed-4", child_object.killed)
})
在运行这些场景中的每一个时,我都会得到以下输出。
?Killed-4 false
?Killed -1 false
[ffmpeg version 3.0.1 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.0 (GCC).... etc. ]
?Killed-2 false
?Killed -3 false
场景 4 - 不裁剪视频
?Killed-4 true
?Killed -1 true
Command failed: C:\Users\XXX\Desktop\windows-electron-forge\node_modules\ffmpeg-static-electron\bin\win\x64\ffmpeg.exe -i C:\Users\XXX\AppData\Local\Temp\4WgnUw\screen_capture_video.mp4 -vf crop=796:763:462:509 C:\Users\XXX\AppData\Local\Temp\4WgnUw\cropped_video.mp4
[Error: ENOENT: no such file or directory, open 'C:\Users\XXX\AppData\Local\Temp\4WgnUw\cropped_video.mp4'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\XXX\\AppData\\Local\\Temp\\4WgnUw\\cropped_video.mp4'
}
?Killed - 2 true
?Killed -3 true
最后一种情况是出于绝望而尝试的。
最佳答案
一旦您收到 exit
您的 .on ("exit", () => { ... });
中的事件函数,没有必要杀死子进程——它已经自行退出,这意味着它已经完成运行并将“死亡”,因为没有什么可做的了。仅当它们应该被迫中止当前正在执行的操作或它们行为不端并没有实际执行任何操作(可以在操作系统的任务管理器中观察到)时才需要杀死进程。
作为Node.js documentation on exit
状态,此事件只会在进程终止时触发。因此,您不再可以在处理函数中杀死它,实际上也不需要这样做,因为它不会像所谓的“僵尸”(见上文)一样存在,因为它已经完成了执行。
因此,以下功能应该足够了:
child_object.on("exit", async () => {
try {
databasePayload.video_buffer = await fsPromises.readFile(path.join(temp_directory, "cropped_video.mp4"), {encoding: 'base64'})
mainWindow.webContents.send("main_process:video_buffer", databasePayload.video_buffer)
} catch (error) {
console.log(error)
}
// ... your file removal code ...
});
await
而是使用函数的同步版本(如果可用)。您的 fs
函数调用将变为:const fs = require ("fs");
const temp_directory = fs.mkdtempSync (fs.realpathSync (os.tmpdir()) + path.sep)
// ...
databasePayload.video_buffer = fs.readFileSync (path.join (temp_directory, "cropped_video.mp4"), { encoding: 'base64' })
// ...
try { fs.rmdirSync (temp_directory, { recursive: true }) } catch (e) { console.log (e); }
process.noAsar = true
除非您的临时目录实际上是在应用程序的 ASAR 存档中创建的,否则应该不需要,除非 Electron Forge 做了一些我不知道的魔术,否则这是不可能的。考虑调查为什么设置此标志可以解决您的问题(可能通过转储临时目录的路径)。 关于node.js - 仅在 readFile() Node js Electron 之后杀死子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67511100/
为了测试并确保我已经把所有东西都放下了,以便以后可以开始扩展,我正在尝试创建一个文件句柄,将给定的字节缓冲区写入该文件句柄,然后读取部分该文件放入新的测试缓冲区。 我有代码: const size_t
这是我的问题: a method readLine that reads a line from the file specified in fileName and returns the
我被认为是一个菜鸟,我在互联网上搜索了几个小时来解决我的问题,但仍然没有运气。 我真的很想了解java,如果你能解释一些细节,我将非常感激。 问题出在这一行 ReadFile file = ReadF
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在编写一个程序,通过 USB 通过虚拟 com 端口与电机驱动器通信。我正在使用 windows.h file-io 与其通信(CreateFile、WriteFile、ReadFile)。我可以
我的问题是关于回调函数的工作方式。 const fs = require('fs'); let fileContents = 'initial value'; fs.readFile('file.tx
我正在尝试使用 readfile 读取一个文件,将其存储到一个宽数组中,然后将其写入另一个文件。问题是,当我将它们并排放置在 HxD 中时,一些字节是正确的(例如文本),但其他一切都完全不同。我也跑不
我正在通过将 COM 端口 RD 和 TD 引脚连接在一起来测试串行端口通信。在执行以下代码之前,COM 端口已被初始化。 CString cs_Send = "F: 5000000 Hz, SF:
我正在使用 Flash 播放器播放一些 mp3 文件。在 Firefox 上它可以正常加载它们,但在 IE 上却不能。当我转到 .mp3 文件的 url 时,它显示了 mp3 的源代码(而不是提供例如
在设置在线文件管理系统时,我遇到了障碍。 我正在尝试使用此 modified version of readfile 将文件推送到客户端: function readfile_chunked($fil
这很很奇怪。 我有一个脚本可以通过浏览器将本地 zip 文件发送给用户。到目前为止,该脚本运行良好,没有任何问题。今天我的同事通知我脚本正在发送零长度文件。 一些背景信息: 在脚本出错之前没有修改服务
在我的函数中,我正在下载一个将下载保存到日志文件的文件。每当我尝试下载我上传的 Excel 文件时,Excel 都会指出它已损坏。我的本地副本工作正常。这是我的 download.php:
是否可以在大小未知且大小不断增加的远程文件上使用 PHP readfile 函数?这是场景: 我正在开发一个脚本,它可以从第三方网站下载视频,同时将视频转码为 MP3 格式。这个 MP3 然后通过 r
我正在使用 PHP readfile 函数读取文件并像这样打印它:print readfile ('anyfile')。这可行,但文件的内容长度也会添加到字符串的末尾。为什么? 最佳答案 readfi
我正在尝试解决从 PHP 脚本下载“zip”文件时遇到的问题。似乎当我使用以下代码下载文件时,下载的文件在文件开头附加了一个额外的 0A09,导致 winzip 抛出损坏错误。 kill_sessi
我是 nodejs 和回调的新手。 所以我有这段代码,当通过 HTTP 发起对服务器的请求时,我在其中读取文件: var http = require("http"); var fs = requir
当使用 readfile() 时——在 Apache 上使用 PHP——文件是立即读入 Apache 的输出缓冲区并完成 PHP 脚本执行,还是 PHP 脚本执行等到客户端完成下载文件(或服务器)超时
我正在使用 php 脚本在必要的 javascript 计时器之后提供从我的网站的下载,此 php 脚本包含在内,导致下载。但是无论我尝试什么,下载的文件都是损坏的。谁能帮我指出我哪里出错了。 这是我
我正在使用下面的代码通过单击按钮下载 csv 文件。 JS: $(document).on("click", "#CSV", function () { var csv_value = $('
我有一个 php 代码,用于根据 URL 中的 file_id 下载文件。一切正常,但我在下载扩展名为 .doc 的文件时遇到问题 这是我的代码,我做错了什么? $file = mysql_fetch
我是一名优秀的程序员,十分优秀!