我正在尝试使用 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/