Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js子进程类型错误:无法读取属性'_可写状态';未定义的_Javascript_Node.js_Ffmpeg_Process_Child Process - Fatal编程技术网

Javascript Node.js子进程类型错误:无法读取属性'_可写状态';未定义的

Javascript Node.js子进程类型错误:无法读取属性'_可写状态';未定义的,javascript,node.js,ffmpeg,process,child-process,Javascript,Node.js,Ffmpeg,Process,Child Process,我试图使用child_进程库将ffmpeg的一部分功能包装到Node.js API中,但是当我试图将任何数据发送到ffmpeg的stdin管道时,我得到一个错误TypeError:Cannot read undefined的属性'\u writeablestate' import {spawn} from "child_process" export default frames => { // Spawn ffmpeg process const ffmpeg = sp

我试图使用
child_进程
库将ffmpeg的一部分功能包装到Node.js API中,但是当我试图将任何数据发送到ffmpeg的stdin管道时,我得到一个错误
TypeError:Cannot read undefined
的属性'\u writeablestate'

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)
TypeError:无法读取未定义的属性“\u writableState”
在Writable.write(_stream_Writable.js:270:20)
在Array.forEach()处
在exports.default(/home/fiendfan1/workspace/nodejs/declare/dist/app/common/encodeVideo.js:21:12)
在_callee$(/home/fiendfan1/workspace/nodejs/declare/dist/app/tests/video.js:34:84)
在tryCatch(/home/fiendfan1/workspace/nodejs/declare/node_modules/registrator runtime/runtime.js:65:40)
在Generator.invoke[as _invoke](/home/fiendfan1/workspace/nodejs/declare/node_modules/registrator runtime/runtime.js:303:22)
在Generator.prototype.(匿名函数)[as next](/home/fiendfan1/workspace/nodejs/declare/node_modules/registrator runtime/runtime.js:117:21)
在Generator.tryCatcher(/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/util.js:16:23)
在PromiseSpawn._promiseCompleted(/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/generators.js:97:49)
在Promise._结算Promise(/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/Promise.js:574:26)
在Promise._settlePromise0(/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/Promise.js:614:10)
在Promise._结算Promises(/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/Promise.js:693:18)
在Async.\u drainQueue(/home/fiendfan1/workspace/nodejs/declare/node\u modules/bluebird/js/release/Async.js:133:16)
在Async.\u drainQueues(/home/fiendfan1/workspace/nodejs/declare/node\u modules/bluebird/js/release/Async.js:143:10)
在Immediate.Async.drainQueues[as _onImmediate](/home/fiendfan1/workspace/nodejs/declare/node_modules/bluebird/js/release/Async.js:17:14)
运行回调时(timers.js:696:18)

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

您不应该将每个图像分别发送到ffmpeg(即frames.forEach(ffmpeg.stdin.write)),而应该为要发送到进程的所有输入数据创建一个缓冲区,并将其写入其stdin
ffmpeg.stdin.end()
应在后面调用,以指示输入结束

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