Arduino和视频?容易的


众所周知,弱的Arduino微控制器无法通过自身传递视频流。
如果您从另一侧着手处理此任务?

...并及时延长拍摄过程。

嘿,许多人已经为自己猜想这种技术称为延时摄影(慢动作单幅拍摄)。即,这不是视频拍摄,而是其结果是创建视频的拍摄。

我承认,起初我并不打算慢动作。我只是想为自己的活动注册活动,包括照片。好吧,然后断断续续。如果我的读者不参与开发,那么他只能看到结果(来自Chrome)。

我的系统包括:
  • Arduino Mega开发板
  • 相机的JPEG模块;
  • 实用程序和MongoDB数据库;
  • 用于托管HTML文件的WEB服务器;


当arduina将其数据发送到服务器时,其自己的时间戳将附加到每个参数。
发送了参数-将一条记录添加到存储库,再发送两次-保存了另外两个记录。

储存库的所有工作都是通过实用程序(以下称为中介程序)执行的,该实用程序在固定计算机上启动。同时,WEB服务器本身仅提供静态内容。也就是说,所有客户端都通过中介的实用程序进行信息交换,类似于流行的MQTT协议。与MQTT的主要区别在于,该中介可以直接与数据仓库配合使用,并提供历史数据。此事实简化了交互方案,并且不需要其他网络流量即可保存数据。

为了方便开发Web应用程序,我使用以下API创建了一个JavaScript库:

这将创建一个用于处理网络存储的客户端:
var client = new MgtClient("localhost", "login", "password", onDebugLog);

功能参数:
  1. 运行中间程序的网络地址,您只需指定IP,例如“ 127.0.0.1”;
  2. 用户登录;
  3. 用户密码
  4. 回调函数,用于调试字符串消息;


用于调试消息的回调函数可能如下所示:
function onDebugLog(aStr) {
  //          
  console.log((new Date()).getTimeString() + ' ' + aStr + '\n'); 
}


还不困难吗?此外,这将是困难的。

存储请求结构:
var request = {
  name: " 1", //   
  placeId: 1, //                         
  beginTime: 1458108472000, //      1  1970 
  endTime: 1458194872000, //      1  1970  ( )
  limit: 10000 //   ,    (   )
};


还不困惑吗?

然后是对请求的响应的结构:
var result = {
  times: [], //      (    1  1970 )
  values: [], //    
  position: 20, //         (   )
  status: "progress", //    ("progress", "abort", "done", "fail")
  progress: 91 //   ( )   
};


是的,它更复杂吗?

“状态”字段的状态:
  • “完成”-收到请求的所有内容(接收到整个时间范围内的数据,或工作记录数量的限制);
  • “进度”-表示这不是最后一条数据,下载过程尚未完成;
  • “中止”-数据下载被中断(对工作的数据总量的限制),您可以立即生成一个新请求以接收丢失的数据;
  • “失败”-出了点问题(也许插座没有电流?)


你认为就这些了吗?不幸的是,没有。

请求的参数可以是不同的类型。
  • 如果参数为数字,则数字将出现在值数组中。
  • 如果是字符串,那么在值数组中将是字符串。
  • 如果为布尔值,则值的数组将为“ true”或“ false”。
  • 如果它是二进制的(例如JPEG图像),则字节数组将在值数组中。
  • 如果这是一个事件,则返回以特殊方式形成的数组。

单个事件记录的示例:
var event = [
  "  ", //   
  "", //   1
  27.5, //   1
  "", //   2
  true, //   2
  ...
  "", //   
  1458108472000 // !!!       ,
                //        .
];

即,每个事件记录可以包含任意一组参数。这样的分组对于分析整体图片非常方便。

乌夫,最难的部分已经过去了。

因此,发送自身的请求看起来像:
// aRequest -  
// onReadArchive -     /
client.readArchive(aRequest, onReadArchive);                                                           


反函数获得答案:
// aResult -  
onReadArchive(aResult) {
  // TODO       

  //   "false",     (    )
  //   "true",      (    ) 
  return false; 
}


最后,我们来到了视频编辑本身。

为了创建视频,我使用了Whammy javascript库,在这里有更多详细信息。

创建视频的功能:

<script src="whammy.js"></script>
<canvas id="canvas" style="display:none"></canvas>
<video id="player" controls autoplay loop></video>

function createVideo() {
  var canvas = document.getElementById("canvas");
  var context = canvas.getContext("2d");
  canvas.width = '640'; //     
  canvas.height = '480'; //     
  var framerate = 10; //     
  var quality = 0.8; //    

  var video = new Whammy.Video(framerate, quality); //       WebM
 
  for (var i = 0; i < images.length; i++) { //    
    var image = images[i];
    context.globalAlpha = 1;
    context.drawImage(image, 0, 0, 640, 480); //     
    video.add(context); //   
  }

  var output = video.compile(); //    
  var url = URL.createObjectURL(output); //    

  document.getElementById('player').src = url; //    
}


不幸的是,您无法在所有浏览器中创建视频。例如,我最喜欢的Firefox不知道如何将图像转换为WebP格式,在此基础上会转换为视频。尽管我找到了一个进行此类转换的javascript库,但转换速度如此之慢(而且帧太多),以至于我拒绝使用它。但是,在所有使用Chrome引擎的浏览器中,此功能都可以使用。

在这里,您可以看到我的所作所为。

没有完整的文档,我可以提供以前的文章。
第1
条第2条

嗯,仅此而已,我无话可说。

Source: https://habr.com/ru/post/zh-CN391773/


All Articles