首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Node JS存储AR-Drone 2.0视频流

使用Node JS存储AR-Drone 2.0视频流
EN

Stack Overflow用户
提问于 2015-07-01 13:47:05
回答 1查看 1.9K关注 0票数 4

我正在试图找到一种方法来保存从AR无人机流传输视频时产生的.png图像。下面的代码使用了felixge的ar-drone模块,成功地将视频流式传输到浏览器,但我想截取此提要的屏幕截图,并将其保存到我的驱动器中,以便进行实时图像分析。

我尝试使用屏幕截图模块来保存连接到主机时在浏览器中显示的内容,但所有这些操作都是保存我指定大小的空白白色图像(参见下面的代码)。有没有更好的方法来保存AR-无人机视频中的静止帧(而不是保存.h264视频源)?

谢谢。

代码语言:javascript
复制
 // 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();
  });
});
EN

回答 1

Stack Overflow用户

发布于 2015-07-02 09:50:36

PngStream已经为您提供了访问PNG图像的权限,您所需要做的就是将它们写入到文件中。以下代码显示如何每5000毫秒将帧保存到文件:

代码语言:javascript
复制
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);
        }
      });
    }
  });

下面是运行代码时的样子:

代码语言:javascript
复制
[wiseman@Intercept node-ar-drone (master)]$ node temp.js
Saving frame
Saving frame
Saving frame
[...]

运行保存在frame1.pngframe2.pngframe3.png中的帧。这是frame1.png

我也用面向下的摄像头测试了代码,它也工作得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31153402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档