gpt4 book ai didi

node.js - 在while循环中运行ffmpeg会导致内存泄漏

转载 作者:行者123 更新时间:2023-12-04 22:56:56 29 4
gpt4 key购买 nike

我正在尝试运行以下 ffmpeg while 中的命令循环 同步 .
每次循环时,我都会等待当前命令完成,然后再继续执行下一个命令。但是我得到了意想不到的结果,然后它崩溃了。

  import ffmpegPath from '@ffmpeg-installer/ffmpeg'
import ffmpeg from 'fluent-ffmpeg'

ffmpeg.setFfmpegPath(ffmpegPath.path)

const command = ffmpeg()

let VIDEOS = 1000
let videoIdx = 1

while (videoIdx <= VIDEOS) {
await new Promise((resolve) => {
command
.on('end', () => {
setTimeout(() => {
console.log(`${videoIdx}/${VIDEOS}`)
videoIdx++
resolve()
}, 100)
})
.on('error', () => {
console.log('error = ', error)
})
.input(`MyExernalHardDrive/input/video-${videoIdx}-frame-%d.png`)
.inputFPS(1/0.0425)
.output(`MyExernalHardDrive/output/video-${videoIdx}.mp4`)
.outputFPS(24)
.noAudio()
.run()
})
}
在控制台中,我希望看到:
1/1000

then

2/1000

then

3/1000

etc..
相反,我正在批量获取日志,例如:
1/1000
2/1000
3/1000

then

4/1000
5/1000
6/1000
7/1000

then it keeps incrementing but I get them in even bigger batches:

45/1000
46/1000
47/1000
48/1000
49/1000
50/1000
51/1000
52/1000
53/1000
54/1000
55/1000

然后我得到:
(node:14509) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 
11 end listeners added to [FfmpegCommand].
Use emitter.setMaxListeners() to increase limit
然后我退出该过程,这些是已创建的文件:
video-1.mp4
video-2.mp4
video-4.mp4
video-7.mp4
video-11.mp4
video-16.mp4
video-22.mp4
video-29.mp4
video-37.mp4
video-46.mp4
video-56.mp4
video-67.mp4
所以看起来:
  • 时间到处都是,根本没有顺序
  • 进程堆积,直到出现内存泄漏

  • 为什么会发生这种情况,因为我使用的是 await在我继续下一个过程之前,我该如何解决这个问题?

    最佳答案

    // ...
    const command = ffmpeg()

    let VIDEOS = 1000
    let videoIdx = 1

    while (videoIdx <= VIDEOS) {
    await new Promise((resolve) => {
    command
    .on('end', () => {
    setTimeout(() => {
    console.log(`${videoIdx}/${VIDEOS}`)
    videoIdx++
    resolve()
    }, 100)
    })
    // ...
    ffmpeg变量中的实例 command在每个循环中都被重用。它是一个事件发射器,不应该被重用,因为有些事件只触发一次,比如“结束”。此单个实例上的“结束”事件接收许多监听器。 Node 运行时发出警告,因为这通常不是您想要的(如果是,您可以选择禁用限制)。
    解决方案是不重复使用相同的实例:
    // ...
    let VIDEOS = 1000
    let videoIdx = 1

    while (videoIdx <= VIDEOS) {
    await new Promise((resolve) => {
    ffmpeg()
    .on('end', () => {
    setTimeout(() => {
    console.log(`${videoIdx}/${VIDEOS}`)
    videoIdx++
    resolve()
    }, 100)
    })
    // ...
    现在,每次循环迭代都会创建一个全新的实例。

    关于node.js - 在while循环中运行ffmpeg会导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70416451/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com