ffmpeg jpeg 流到 webm 只创建一个文件 .webm 与 1 帧(快照)或空 .webm 文件(mjpeg)

ffmpeg jpeg stream to webm only creates a file .webm with 1 frame (snapshot) or empty .webm file (mjpeg)

我的问题是,当我尝试将一系列 jpeg 转换为 webm 视频时。我要么得到一个只有一个框架的 webm 文件,要么得到一个没有任何内容的 webm 文件 (0 kb)。

var fs = require('fs');
var path = require('path');

var outStream = fs.createWriteStream(__dirname+'/output.webm');
var ffmpeg = require('fluent-ffmpeg');

这是一个 mjpeg 流 URL。它生成一个什么都没有的文件。

//var proc = new ffmpeg({source:'http://xxx.xxx.xxx.xxx/goform/stream?cmd=get&channel=0',timeout:0})

这是快照 URL。它生成一个只有一个帧的文件。

var proc = new ffmpeg({source:'http://xxx.xxx.xxx.xxx/snapshot/view0.jpg',timeout:0})

.fromFormat('mjpeg')
.size('2048x1536')
.toFormat('webm')
.withVideoBitrate('800k')
.withFps(20)

我试过用管道代替,但没有骰子:(

//.pipe(outStream,{end:false});
.writeToStream(outStream,{end:false})

感谢任何帮助。

在这一点上,我准备使用带有 exec 的基本 shell 命令,但是当我尝试这样做时,我也遇到了错误。是的,不用说我是菜鸟

旁注:

我已经尝试过像 zoneminder 这样的东西,但它只是与我们的相机和相机数量有关。所以我正在制作一个简单的解决方案来记录它们。使用我们当前的云服务,我们错过了非常重要的时刻,并且它会花费更多的精力和时间。

感谢所有看过并试图弄明白的人:)

我用这种方法取得了一些成功。它本质上是使用 快照 URL 而不是 MJPEG。这使用请求。但是从技术上讲,您可以使用任何东西,因为该方法使用的是 pipeimage2pipe.

var spawn = require('child_process').spawn;
var request = require('request');
var args = '-f image2pipe -r 1 -vcodec mjpeg -i - -f webm -r 1 test3.webm';
var encoder = spawn('ffmpeg', args.split(' '));
encoder.stderr.pipe(process.stdout);
var interval = function(){
    request('http://xxx.xxx.xxx.xxx/snapshot/view0.jpg',function(er){
        if(er){console.log(er)}
        setTimeout(function(){interval()},1000)
    }).pipe(encoder.stdin,{end:false})
}
interval();

我本可以使用 setInterval,但我只希望它在完成请求后重试。

编辑: 事实证明,当我尝试在最初的问题中使用该方法时,我的相机已关闭,所以我不确定它是否有效...但我知道这适用于 MJPEG

var spawn = require('child_process').spawn;
var args = '-f mjpeg -framerate 1 -i http://xxx.xxx.xxx.xxx/goform/stream?cmd=get&channel=0 -vcodec libvpx -framerate 1 -bitrate 256k video_file.webm -y';
console.log(args)
var encoder = spawn('ffmpeg', args.split(' '));
encoder.stderr.pipe(process.stdout);