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

标签 json node.js parsing ffmpeg spawn

所以我看了很多关于 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

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

frame= 4852 fps= 30 q=6.8 size=   30506kB time=00:02:41.74 bitrate=1545.1kbits/s speed=   1x    \r

并用它来获取一个 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);
});

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

另一件需要注意的事情,你会注意到日志通过 stderr 返回吗,我在网上看到过这个,显然很多人都这样做了?所以我不确定这有什么关系?但代码是 sdterr 回调。

非常感谢任何帮助,因为我真的很困惑我做错了什么。

谢谢。

最佳答案

关于此的更新,我在 IRC channel 之外与其中一个人合作:FreeNode 上的#ffmpeg。答案是通过管道将输出发送到标准输出。

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

-progress pipe:1

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

-progress url (global) Send program-friendly progress information to url. Progress information is written approximately every second and at the end of the encoding process. It is made of "key=value" lines. key consists of only alphanumeric characters. The last key of a sequence of progress information is always "progress".

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

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);

});

感谢所有评论!

关于json - 如何在 NodeJS 中成功解析 FFMpeg 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075597/

相关文章:

node.js - Express URI错误: Failed to decode param

node.js - 退出时的 Node js进程无法永远使用

c# - 用于解析的可扩展类型安全枚举类?

java - 如何使用 SimpleDateFormat 解析多种格式的日期

jquery - MVC4 中使用 Knockout.js 的级联下拉菜单,JSON 根据验证器返回有效的 JSON,但 Jscript 出现无效字符错误

javascript - Twitch TV JSON API 问题

node.js - Node.exe 卡在 100% CPU

json - Azure 认知服务 : Face Find Similar 'BadArgument' , 'Argument faceListId and faceIds cannot be provided at the same time.' 。'

javascript - Html 元素允许 Ctrl+A 组合其中的文本

sql - 哪种语言有好的 SQL 解析库?