ffmpeg jpeg stream to webm只创建一个文件.webm,包含1帧(快照)或空.webm文件(mjpeg)

时间:2016-11-12 06:39:25

标签: node.js ffmpeg jpeg mjpeg webm

我的问题是,当我尝试将一系列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})

这是一个快照网址。它生成一个单帧的文件。

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这样的东西,但它只是打破了我们的相机和相机的数量。所以我正在制作一个简单的解决方案来记录它们。通过我们当前的云服务,我们错过了非常重要的时刻,并且在能源和时间方面的成本更高。

1 个答案:

答案 0 :(得分:0)

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

我用这种方法取得了一些成功。它基本上取决于快照URL 而不是MJPEG。这使用了请求。但是你可以在技术上使用任何东西,因为该方法使用管道。的 image2pipe

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