javascript - Node.js child_process TypeError : Cannot read property '_writableState' of undefined

标签 javascript node.js ffmpeg process child-process

我正在尝试使用 child_process 将 ffmpeg 的一部分功能包装在 Node.js API 中。库,但是当我尝试将任何数据发送到 ffmpeg 的标准输入管道时,我收到一个错误 TypeError: Cannot read property '_writableState' of undefined .

import {spawn} from "child_process"

export default frames => {
    // Spawn ffmpeg process
    const ffmpeg = spawn("ffmpeg", ["-f", "image2pipe", "-i", "-", "output.mkv"])
    // Send frames to ffmpeg as stdin
    frames.forEach(ffmpeg.stdin.write)

    // Listen for output and errors
    return new Promise((resolve, reject) => {
        const chunks = []

        ffmpeg.stdout.on("data", chunks.push)
        ffmpeg.stderr.on("data", reject(data))
        ffmpeg.on("close", code =>
            resolve(Buffer.concat(chunks))
        )
    })
}

错误:
TypeError: Cannot read property '_writableState' of undefined
    at Writable.write (_stream_writable.js:270:20)
    at Array.forEach (<anonymous>)
    at exports.default (/home/fiendfan1/workspace/nodejs/declare/dist/app/common/encodeVideo.js:21:12)
    at _callee$ (/home/fiendfan1/workspace/nodejs/declare/dist/app/tests/video.js:34:84)
    at tryCatch (/home/fiendfan1/workspace/nodejs/declare/node_modules/regenerator-runtime/runtime.js:65:40)
    at Generator.invoke [as _invoke] (/home/fiendfan1/workspace/nodejs/declare/node_modules/regenerator-runtime/runtime.js:303:22)
    at Generator.prototype.(anonymous function) [as next] (/home/fiendfan1/workspace/nodejs/declare/node_modules/regenerator-runtime/runtime.js:117:21)
    at Generator.tryCatcher (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/util.js:16:23)
    at PromiseSpawn._promiseFulfilled (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/generators.js:97:49)
    at Promise._settlePromise (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/promise.js:574:26)
    at Promise._settlePromise0 (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/promise.js:693:18)
    at Async._drainQueue (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:696:18)

最佳答案

这里的问题是我向子流程发送输入的方式。

而不是将每个图像单独发送到 ffmpeg(即 frames.forEach(ffmpeg.stdin.write) ),您应该创建一个包含所有输入数据的缓冲区以发送到进程,并将其写入其标准输入。 ffmpeg.stdin.end()应该在之后调用以指示输入结束。

ffmpeg.stdin.write(Buffer.concat(frames))
ffmpeg.stdin.end()

关于javascript - Node.js child_process TypeError : Cannot read property '_writableState' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50285093/

相关文章:

javascript - Node.js - https.get() 和 JSON.parse() 使服务器崩溃

javascript - Arduino JSON over Serial,Json.Parse 返回意外的 JSON 输入

javascript - 创建 react 应用程序时出现此错误 : Cannot find module './lib/pack.js'

javascript - 如何有效地将通过 javascript 对 html 文档所做的本地更改更改回服务器?

javascript - 浏览器如何缓存在 Flash 中动态加载的图像

javascript - ER_TRUNCATED_WRONG_VALUE : Incorrect datetime value

javascript - 在文档写入中创建新行 (JavaScript)

c# - 如何在 FFMPEG 的特定位置设置水印?

filter - FFmpeg AVFilter 以编程方式覆盖/水印

ffmpeg - 使用 FFMPEG 更改 mp4 视频持续时间