如何在NodeJS中成功解析FFMpeg的输出

Dan*_*SMc 5 parsing json ffmpeg spawn node.js

因此,我看了很多关于FFMPeg的主题,这是我今天学到的一个很棒的工具,但是我花了整整一天的时间完善命令,现在对NodeJS的部分有些困惑。

本质上,该命令执行以下操作:从Mac OSX网络摄像头获取输入,然后将其流式传输到网络套接字。现在,我查看了许多NodeJS库,但是找不到满足我需要的库。还是不知道该怎么做。这是我正在使用的命令的示例:

ffmpeg -f avfoundation -framerate 30 -video_size 640x480 -pix_fmt uyvy422 -i "0:1" -f mpegts -codec:v mpeg1video -s 640x480 -b:v 1000k -bf 0 http://localhost:8081/stream
Run Code Online (Sandbox Code Playgroud)

这可以完成流方面所需的一切,但是我希望通过NodeJS调用它,然后能够监视日志并解析返回的数据,例如:

frame= 4852 fps= 30 q=6.8 size=   30506kB time=00:02:41.74 bitrate=1545.1kbits/s speed=   1x    \r
Run Code Online (Sandbox Code Playgroud)

并使用它获取一个JSON数组供我输出到网页。

现在,我正在做的工作是实际解析数据的方法,并且我已经针对此类问题查看了许多其他答案,但是我似乎无法拆分/替换/正则表达式。除了一长串,我什么也收不到。

这是我正在使用的代码(NodeJS):

var ffmpeg = require('child_process').spawn('/usr/local/Cellar/ffmpeg/3.3.1/bin/ffmpeg', ['-f', 'avfoundation', '-framerate', '30', '-video_size', '640x480', '-pix_fmt', 'uyvy422', '-i', '0:1', '-f', 'mpegts', '-codec:v', 'mpeg1video', '-s', '640x480', '-b:v', '1000k', '-bf', '0', 'http://localhost:8081/test']);

ffmpeg.on('error', function (err) {
    console.log(err);
});

ffmpeg.on('close', function (code) {
    console.log('ffmpeg exited with code ' + code);
});

ffmpeg.stderr.on('data', function (data) {
    // console.log('stderr: ' + data);
    var tData = data.toString('utf8');
    // var a = tData.split('[\\s\\xA0]+');
    var a = tData.split('\n');
    console.log(a);
});

ffmpeg.stdout.on('data', function (data) {
    var frame = new Buffer(data).toString('base64');
    // console.log(frame);
});
Run Code Online (Sandbox Code Playgroud)

我已经尝试过用新行,墨盒返回,空格,制表符进行拆分,但是我似乎无法获得可以使用的基本位数组。

还要注意的另一件事是,您是否会注意到日志是通过stderr返回的,我已经在网上看到了,显然它对很多人都有用吗?因此,我不确定该如何处理?但是代码是sdterr回调。

非常感谢您的帮助,因为我对自己做错的事情感到困惑。

谢谢。

Dan*_*SMc 10

关于这一点的更新,我与 IRC 频道中的一个人合作:#ffmpeg on FreeNode。答案是通过管道将输出发送到标准输出。

例如,我将以下内容附加到 FFMpeg 命令中:

-progress pipe:1
Run Code Online (Sandbox Code Playgroud)

进度标志用于每秒提供一个输出,其中包含有关流的信息,因此这几乎是每秒从 stderr 流获得的所有内容,但以我可以解析的格式通过管道传输到 stdout 流。以下摘自文档。

-progress url (全局) 将程序友好的进度信息发送到 url。进度信息大约每秒写入一次,并在编码过程结束时写入。它由“key=value”行组成。键仅由字母数字字符组成。进度信息序列的最后一个键始终是“进度”。

这是我用来解析流信息的代码示例:

ffmpeg.stdout.on('data', function (data) {

    var tLines = data.toString().split('\n');
    var progress = {};
    for (var i = 0; i < tLines.length; i++) {
        var item = tLines[i].split('=');
        if (typeof item[0] != 'undefined' && typeof item[1] != 'undefined') {
            progress[item[0]] = item[1];
        }
    }

    // The 'progress' variable contains a key value array of the data
    console.log(progress);

});
Run Code Online (Sandbox Code Playgroud)

感谢所有评论的人!