Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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
Node.js错误:生成进程ffmpeg ChildProcessError_Node.js_Websocket_Ffmpeg - Fatal编程技术网

Node.js错误:生成进程ffmpeg ChildProcessError

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环境变量已注

我想简单地制作一个像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}