Node.js错误:生成进程ffmpeg ChildProcessError
我想简单地制作一个像OBS这样的程序 我理想的代码行为是在Node.js中创建一个子进程,并执行FFMPEG命令将网络摄像头流发送到yourtube live RTMP服务器。但是,实际行为是由node.js中使用的子进程承诺模块中的错误引起的 我检查了几个问题,但我没有足够的经验去理解它们,我希望有一个明确的解决方案 我猜是因为我在节点环境中找不到FFMPEG的命令地址。还是从套接字环境调用是一个问题 我检查了FFMPEG命令是否在Windows提示符环境中工作 ※注:FFMPEG环境变量已注册 环境:Node.js错误:生成进程ffmpeg ChildProcessError,node.js,websocket,ffmpeg,Node.js,Websocket,Ffmpeg,我想简单地制作一个像OBS这样的程序 我理想的代码行为是在Node.js中创建一个子进程,并执行FFMPEG命令将网络摄像头流发送到yourtube live RTMP服务器。但是,实际行为是由node.js中使用的子进程承诺模块中的错误引起的 我检查了几个问题,但我没有足够的经验去理解它们,我希望有一个明确的解决方案 我猜是因为我在节点环境中找不到FFMPEG的命令地址。还是从套接字环境调用是一个问题 我检查了FFMPEG命令是否在Windows提示符环境中工作 ※注:FFMPEG环境变量已注
Window10
,node.js
,ffmpeg
代码利用了一个简单的WebSocket示例
当我第一次调查时,我认为唯一的方法是使用“fluent effmeg”
我尝试了“fluent ffmpeg”,但我无法在Windows环境中启动并运行笔记本电脑网络摄像头作为“fluent ffmppeg”命令的参数
我也考虑过使用WebRTC,但我认为它不是个人使用的,因为它是一个P2P连接。(我还了解了如何将对等连接连接到像Janus这样的WebRTC服务器,但我没有足够的参考资料来理解它。)
下面是问题的代码
const SocketIO = require("socket.io");
const ffmpeg = require("fluent-ffmpeg");
const spawn = require("child-process-promise").spawn;
module.exports = server => {
const io = SocketIO(server, { path: "/socket.io" });
io.on("connection", socket => {
const req = socket.request;
const ip = req.headers["x-forwarded-for"] || req.connection.remoteAddress;
console.log("새로운 클라이언트 접속!", ip, socket.id, req.ip);
socket.on("disconnect", () => {
console.log("클라이언트 접속해제", ip, socket.id);
clearInterval(socket.interval);
});
socket.on("error", error => {
console.error(error);
});
socket.on("reply", data => {
console.log(data);
ffmpeg_command();
});
});
function ffmpeg_command() {
let arg = [
"-f",
"lavfi",
"-i",
"anullsrc=r=16000:cl=mono",
"-f",
"dshow",
"-ac",
"2",
"-i",
"video='HP Truevision HD'",
"-s",
"1280x720",
"-r",
"10",
"-vcodec",
"libx264",
"-pix_fmt",
"yuv420p",
"-preset",
"ultrafast",
"-r",
"25",
"-g",
"20",
"-b:v",
"2500k",
"-codec:a",
"libmp3lame",
"-ar",
"44100",
"-threads",
"6",
"-b:a",
"11025",
"-bufsize",
"512k",
"-f",
"flv",
"rtmp://a.rtmp.youtube.com/live2/8dfu-69k0-dxyw-896q"
];
spawn("ffmpeg", arg).catch(e => {
console.log(e);
});
}
};
这里有一个错误:预期的结果是你的网络摄像头工作正常,YouTube直播成功
{ ChildProcessError: `ffmpeg -f lavfi -i anullsrc=r=16000:cl=mono -f dshow -ac 2 -i video='HP Truevision HD' -s 1280x720 -r 10 -vcodec libx264 -pix_fmt yuv420p -preset ultrafast -r 25 -g 20 -b:v 2500k -codec:a libmp3lame -ar 44100 -threads 6 -b:a 11025 -bufsize 512k -f flv rtmp://a.rtmp.youtube.com/live2/8dfu-69k0-dxyw-896q` failed with code 1
at ChildProcess.<anonymous> (C:\Users\Tricky\Desktop\Work\ESC\ESC_temp\node_modules\child-process-promise\lib\index.js:132:23)
at ChildProcess.emit (events.js:182:13)
at ChildProcess.cp.emit (C:\Users\Tricky\Desktop\Work\ESC\ESC_temp\node_modules\child-process-promise\node_modules\cross-spawn\lib\enoent.js:40:29)
at maybeClose (internal/child_process.js:962:16)
at Socket.stream.socket.on (internal/child_process.js:381:11)
at Socket.emit (events.js:182:13)
at Pipe._handle.close (net.js:606:12)
name: 'ChildProcessError',
code: 1,
childProcess:
ChildProcess {
_events: { error: [Function], close: [Function] },
_eventsCount: 2,
_maxListeners: undefined,
_closesNeeded: 3,
_closesGot: 3,
connected: false,
signalCode: null,
exitCode: 1,
killed: false,
spawnfile: 'ffmpeg',
_handle: null,
spawnargs:
[ 'ffmpeg',
'-f',
'lavfi',
'-i',
'anullsrc=r=16000:cl=mono',
'-f',
'dshow',
'-ac',
'2',
'-i',
'video=\'HP Truevision HD\'',
'-s',
'1280x720',
'-r',
'10',
'-vcodec',
'libx264',
'-pix_fmt',
'yuv420p',
'-preset',
'ultrafast',
'-r',
'25',
'-g',
'20',
'-b:v',
'2500k',
'-codec:a',
'libmp3lame',
'-ar',
'44100',
'-threads',
'6',
'-b:a',
'11025',
'-bufsize',
'512k',
'-f',
'flv',
'rtmp://a.rtmp.youtube.com/live2/8dfu-69k0-dxyw-896q' ],
pid: 18928,
stdin:
Socket {
connecting: false,
_hadError: false,
_handle: null,
_parent: null,
_host: null,
_readableState: [ReadableState],
readable: false,
_events: [Object],
_eventsCount: 1,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
[Symbol(asyncId)]: 132,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0 },
stdout:
Socket {
connecting: false,
_hadError: false,
_handle: null,
_parent: null,
_host: null,
_readableState: [ReadableState],
readable: false,
_events: [Object],
_eventsCount: 2,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
write: [Function: writeAfterFIN],
[Symbol(asyncId)]: 133,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0 },
stderr:
Socket {
connecting: false,
_hadError: false,
_handle: null,
_parent: null,
_host: null,
_readableState: [ReadableState],
readable: false,
_events: [Object],
_eventsCount: 2,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
write: [Function: writeAfterFIN],
[Symbol(asyncId)]: 134,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBytesRead)]: 1615,
[Symbol(kBytesWritten)]: 0 },
stdio: [ [Socket], [Socket], [Socket] ],
emit: [Function] },
stdout: undefined,
stderr: undefined }
{ChildProcessError:`ffmpeg-f lavfi-i anullsrc=r=16000:cl=mono-f dshow-ac 2-i video='HP Truevision HD'-s 1280x720-r 10-vcodec libx264-pix_fmt yuv420p-preset ultrafast-r25-g20-b:v2500k-codec:a libmp3lame-ar 44100-threads 6-b:a 11025-bufsize 512k-f flvrtmp://a.rtmp.youtube.com/live2/8dfu-69k0-dxyw-896q`失败,代码为1
在ChildProcess。(C:\Users\Tricky\Desktop\Work\ESC\ESC\u temp\node\u modules\child process promise\lib\index.js:132:23)
在ChildProcess.emit(events.js:182:13)
在ChildProcess.cp.emit(C:\Users\Tricky\Desktop\Work\ESC\ESC\u temp\node\u modules\child process promise\node\u modules\cross spawn\lib\enoint.js:40:29)
在maybeClose(内部/子进程js:962:16)
在Socket.stream.Socket.on(internal/child_process.js:381:11)
在Socket.emit(events.js:182:13)
在管道处。\u handle.close(net.js:606:12)
名称:“ChildProcessError”,
代码:1,,
子进程:
子进程{
_事件:{error:[Function],close:[Function]},
_事件提示:2,
_maxListeners:未定义,
_关闭所需时间:3,
_关闭日期:3,
联系:错,
信号代码:空,
出口代码:1,
被杀:错,
生成文件:“ffmpeg”,
_句柄:null,
产卵参数:
['ffmpeg',
“-f”,
“拉夫菲”,
“-我”,
‘anullsrc=r=16000:cl=mono’,
“-f”,
“dshow”,
“-ac”,
'2',
“-我”,
'视频=\'HP Truevision HD\',
“-s”,
“1280x720”,
“-r”,
'10',
“-vcodec”,
“libx264”,
“-pix_fmt”,
“yuv420p”,
“-预设”,
“超快”,
“-r”,
'25',
“-g”,
'20',
“-b:v”,
‘25000K’,
“-编解码器:a”,
“libmp3lame”,
“-ar”,
'44100',
“-线程”,
'6',
“-b:a”,
'11025',
“-bufsize”,
“512k”,
“-f”,
“flv”,
'rtmp://a.rtmp.youtube.com/live2/8dfu-69k0-dxyw-896q' ],
pid:18928,
标准文本:
插座{
连接:错,
_haderro:false,
_句柄:null,
_父项:null,
_主机:空,
_readableState:[readableState],
可读性:错误,
_事件:[对象],
_事件提示:1,
_maxListeners:未定义,
_可写状态:[可写状态],
可写:false,
AllowAllOpen:错误,
_sockname:null,
_pendingData:null,
_彭丁编码:'',
服务器:空,
_服务器:空,
[符号(异步ID)]:132,
[符号(LastWriteEqueSize)]:0,
[符号(超时)]:空,
[符号(千字节数)]:0,
[符号(kbyteswrited)]:0},
标准:
插座{
连接:错,
_haderro:false,
_句柄:null,
_父项:null,
_主机:空,
_readableState:[readableState],
可读性:错误,
_事件:[对象],
_事件提示:2,
_maxListeners:未定义,
_可写状态:[可写状态],
可写:false,
AllowAllOpen:错误,
_sockname:null,
_pendingData:null,
_彭丁编码:'',
服务器:空,
_服务器:空,
write:[函数:writeAfterFIN],
[符号(异步ID)]:133,
[符号(LastWriteEqueSize)]:0,
[符号(超时)]:空,
[符号(千字节数)]:0,
[符号(kbyteswrited)]:0},
标准:
插座{
连接:错,
_haderro:false,
_句柄:null,
_父项:null,
_主机:空,
_readableState:[readableState],
可读性:错误,
_事件:[对象],
_事件提示:2,
_maxListeners:未定义,
_可写状态:[可写状态],
可写:false,
AllowAllOpen:错误,
_sockname:null,
_pendingData:null,
_彭丁编码:'',
服务器:空,
_服务器:空,
write:[函数:writeAfterFIN],
[符号(异步ID)]:134,
[符号(LastWriteEqueSize)]:0,
[符号(超时)]:空,
[符号(KB)]:1615,
[符号(kbyteswrited)]:0},
stdio:[[Socket],[Socket],[Socket]],
emit:[函数]},
标准输出:未定义,
stderr:undefined}