Сохранение видеопотока AR-Drone 2.0 с помощью Node JS
Я пытаюсь найти способ сохранить изображения.png, полученные при потоковой передаче видео с AR-Drone. Следующий код, который использует модуль ar-drone от felixge, успешно передает видео в браузер, но я хотел бы сделать снимок экрана этого канала и сохранить его на своем диске для анализа изображений в реальном времени.
Я пытаюсь использовать модуль скриншота, чтобы сохранить то, что появляется в моем браузере, когда я подключаюсь к хосту, но все, что это делает, это сохраняет чистое белое изображение размера, который я указываю (см. Код ниже). Есть ли лучший способ сохранить неподвижный кадр из видео AR-Drone (НЕ сохранять видеопоток.h264)?
Спасибо.
// Run this to receive a png image stream from your drone.
var arDrone = require('ar-drone'); //Call AR-drone module
var http = require('http'); //Allows video to be displayed to browser
var client = arDrone.createClient(); //Create AR-drone client--->IP address, video frame rate, image sizing
var pngStream = client.getPngStream(); //Fetch real-time video feed from quad
var fs = require('fs');
var screenshot = require('node-webkit-screenshot');
client.config('general:navdata_options', 777060865); //turn on GPS
client.config('video:video_channel',3); //Switch feed to downward-facing camera
var lastPng;
pngStream
.on('error', console.log)
.on('data', function(pngBuffer) {
lastPng = pngBuffer; //Store latest png still frame
});
var server = http.createServer(function(req, res) {
if (!lastPng) {
res.writeHead(503);
res.end('Did not receive any png data yet.');
return;
}
res.writeHead(200, {'Content-Type': 'image/png'});
res.end(lastPng);
});
server.listen(8080, function() {
console.log('Serving latest png on port 8080 ...');
})
screenshot({
url : 'http://localhost:8080',
width : 640,
height : 360
})
.then(function(buffer){
fs.writeFile('Drone.png', buffer, function(){
console.log('Screenshot saved') ;
screenshot.close();
});
});
1 ответ
PngStream уже дает вам доступ к изображениям PNG, все, что вам нужно сделать, это записать их в файл. Следующий код показывает, как сохранять кадр в файл каждые 5000 миллисекунд:
var arDrone = require('ar-drone');
var client = arDrone.createClient();
var fs = require('fs');
var pngStream = client.getPngStream();
var frameCounter = 0;
var period = 5000; // Save a frame every 5000 ms.
var lastFrameTime = 0;
pngStream
.on('error', console.log)
.on('data', function(pngBuffer) {
var now = (new Date()).getTime();
if (now - lastFrameTime > period) {
frameCounter++;
lastFrameTime = now;
console.log('Saving frame');
fs.writeFile('frame' + frameCounter + '.png', pngBuffer, function(err) {
if (err) {
console.log('Error saving PNG: ' + err);
}
});
}
});
Вот как это выглядит при запуске кода:
[wiseman@Intercept node-ar-drone (master)]$ node temp.js
Saving frame
Saving frame
Saving frame
[...]
Это запустить сохраненные кадры в frame1.png
, frame2.png
а также frame3.png
, Вот frame1.png
:
Я также тестировал код с обращенной вниз камерой, и он работал так же хорошо.