我的问题是,当我试图将一系列的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这样的东西,但它只是打破了我们的相机和相机的数量。所以我要做一个简单的解决方案来记录它们。随着我们目前的云服务,我们正在错过非常重要的时刻,它的成本更多的能源和时间。
发布于 2016-11-14 05:20:16
谢谢每一个看了一眼并想弄清楚的人:)
我在这种方法上取得了一些成功。它实际上是关闭了快照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);https://stackoverflow.com/questions/40560255
复制相似问题