2016-11-12 40 views
0

我的问题是,当我尝试将一系列jpeg转换为webm视频时。我得到一个带有单个框架的webm文件或一个没有任何内容的webm文件(0 kb)。ffmpeg jpeg stream to webm只创建一个带有1帧(快照)或空的.webm文件(mjpeg)的.webm文件

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命令,但当我尝试我只是得到错误也是。不用说,我是一个noob。

附注:

我已经尝试过类似zoneminder的事情,但它只是打破了我们的相机和相机的数量。所以我正在制作一个纯粹的骨头解决方案来记录它们。通过我们目前的云服务,我们错过了非常重要的时刻,并且耗费更多的精力和时间。

回答

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但我只希望它读完后请求重试。

编辑: 事实证明我的相机是下来的时候我试图用该方法在这样的IM不知道它的工作原理初始问题...但我知道这确实为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);