2016-11-12 81 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);