简单,高效!EdgerOS 应用中的 Media Center

leecactus0 2022-07-01 17:01:54

谈起 Node.js,大多数人了解它是一个常见操作系统中的 JavaScript 运行环境,与之对应 EdgerOS 智能边缘计算操作系统也有一个内置的 JavaScript 运行环境 JSRE。而 Node.js 之所以能被广为人知很大程度上是因为它本身的模块系统能为开发者提供大量的模块, 如 fs , http 等。同样,JSRE 也为广大开发者提供了许多高效,易用的模块,Media Center 即为这些模块中的一员。

 

Media Center 解决的问题

当开发人员在开发应用时,时常有媒体资源保存和读取的需求,此时应该使用什么样的文件结构存储这些资源文件,又应该如何高效地索引资源文件?为了解决这个问题,EdgerOS 为爱智应用提供了媒体资源仓库 —— Media Center;爱智应用直接引入这个模块就能非常方便且保存和读取共享的媒体资源。

 

引入方式


const MediaCenter = require('mediacenter');
//or
const MediaCenter = require('async/mediacenter');

支持的 API 列表

 

MediaCenter Class

 

new MediaCenter()

对 MediaCenter 进行实例化,返回一个 MediaCenter 的实例对象。

 

MediaCenter.columns

  • album 表示集合的名称,默认值为 default

  • ext 媒体文件的扩展名

  • acoid 保存媒体文件时的用户 ID

  • app 哪个应用程序保存了这个媒体文件

  • digest 媒体文件 MD5 校验值

  • time 保存文件时指定的时间

  • size 文件的大小,以 byte 为计量单位

 

可以使用这些字段对媒体资源进行联合搜索。

示例如下:


const MediaCenter = require('mediacenter')
console.log(MediaCenter.columns)

/** 输出内容如下:
[
    { name: 'album',  type: 'text' },
    { name: 'ext',    type: 'text' },
    { name: 'acoid',  type: 'text' },
    { name: 'app',    type: 'text' },
    { name: 'digest', type: 'text' },
    { name: 'time',   type: 'integer' },
    { name: 'size',   type: 'integer' }
];
*/

当我们进行查询操作时,可以使用上述的这些字段进行联合查询,这个相当于 SQL 语句中的  WHERE 子句,亦可使用 ORDER BY 进行排序。

 

MediaCenter Object

mediacenter.total(callback[, condition])

  • callback {Function} 回调函数

    • error {Error} 错误处理

  • total {Integer} 媒体资源的总数

  • condition {String} 统计搜索条件. 默认为:unconditional

 

可以用来统计满足相关条件的媒体资源数量。

示例如下:


var mediacenter = new MediaCenter();

mediacenter.total(function(error, count) {
    if (error) {
            console.error(error.message);
    } else {
            console.log('Total number:', count);
    }
});

// 增加 WHERE 子句条件
mediacenter.total(function(error, count) {
    if (error) {
            console.error(error.message);
    } else {
            console.log('Number of default album:', count);
    }
}, `album='default'`);

mediacenter.albums(callback[, condition])

  • callback {Function} 回调函数

    • error {Error} 错误处理

  • list {Array} 媒体集合列表.

  • condition {String} 统计搜索条件. 默认为:unconditional

 

在指定条件下从媒体中心获取媒体集合列表。

示例如下:


mediacenter.albums(function(error, list) {
    if (Array.isArray(list)) {
        console.log('All albums:', list);
    }
});

    mediacenter.list(callback[, condition[, limit[, offset]]])

    • callback {Function} 回调函数

      • error {Error} 错误处理

    • list {Array} 媒体集合列表.

    • condition {String} 统计搜索条件. 默认为:unconditional

    • limit {Integer} 查询数量限制,默认为:unlimit

      • offset {Integer} 开始查询的位置,默认为:0

       

      获取媒体资源描述信息列表,列表中的每个成员包含以下内容:

      • id {Integer} 媒体资源的 ID

      • ext {String} 媒体资源的扩展名

      • size {Integer} 原始资源的大小

      • digest {String} 媒体文件 MD5 校验值

      示例如下:

       

      
      // 获取前50个媒体资源描述信息
      mediacenter.list(function(error, descs) {
          if (descs) {
              descs.forEach(function(item) {
                  console.log(item.id, item.ext, item.size);
              });
          }
      }, undefined, 50);

      mediacenter.info(id, callback)

      • id {Integer} 媒体资源的 ID

      • callback {Function} 回调函数

        • error {Error} 错误处理

      • info {Object} 媒体资源的信息 获取对应媒体资源的有关信息 info 包含以下内容 :

        • album {String} 所在集合的名称

      • ext {String} 媒体资源的扩展信息

      • acoid {String} 保存媒体文件时的用户 ID

      • app {String} 保存媒体文件的应用

      • digest {String} 媒体文件 MD5 校验值

      • time {Integer} 保存文件时指定的时间

      • size {Integer} 原始资源大小

      • position {Object} 位置信息

      • extra {Object} 保存媒体信息时的自定义信息

       

      如果 position 对象存在,,则 position 包含以下内容:

      • latitude {Integer} 纬度

      • longitude {Integer} 经度

       

      mediacenter.remove(id[, callback])

      • id {Integer} 媒体资源的 ID

      • callback {Function} 回调函数

        • error {Error}错误处理

       

      删除指定 ID 的媒体资源。

      示例如下

      
      // 删除旧的资源
      mediacenter.list(function(error, list) {
          if (list) {
                  mediacenter.remove(list[0].id);
          }
      }, `ORDER BY time ASC`, 1);

      mediacenter.get(id, thumbnail, callback[, opt])

      • id {Integer} 媒体资源的 ID

      • thumbnail {Boolean} 是否获取缩略图

      • callback {Function} 回调函数

        • error {Error} 错误处理

      • stream {ReadStream} 媒体资源的可读流

      • opt {Object} 获取时的设置选项

        • offset {Integer} 视频开始的位置 ,单位为字节

      • length {Integer} 视频长度, 单位为字节,默认为:整个视频文件的大小

       

      获取指定 ID 的媒体资源:当保存媒体资源时,EdgerOS 会自动生成这个资源的缩略图 (音频文件没有缩略图);可以通过设置 thumbnail 参数决定是否要获取缩略图;缩略图为 JPEG 格式。

       

      注意:EdgerOS 严格控制每个应用程序可以并行获取媒体资源的最大范围,典型值为 32因此不要同时获取超过此限制的媒体资源。

      示例如下:

      
      var dest = fs.createWriteStream('./dest.jpg');
      
      // 获取扩展名为 .jpg 的缩略图
      mediacenter.list(function(error, list) {
          if (list) {
              mediacenter.get(list[0].id, true, function(e, r) {
                  if (r) {
                      r.pipe(dest);
                  }
              })
          }
      }, `ext='.jpg'`, 1);
      

      注意:opt.offset 和 opt.length 对缩略图选项无效。

       

      mediacenter.save(chunk[, opt], callback, ext)

      • chunk {Buffer} 媒体资源的数据流,保存 chuck 到媒体中心。

        • album {String} 集合的名称, 默认为:"default"

      • acoid {String} 保存媒体文件时的用户 ID

      • position {Object} 位置信息

      • extra {Object} 媒体资源信息保存时的自定义信息

      • opt {Object} 媒体资源选项

      • callback {Function} 回调函数

        • error {Error} 错误处理

      • id {Integer} 媒体资源的 ID

      • ext {String} 媒体资源的扩展名

       

      示例如下:

      
      var chunk = fs.readFile('./aaa.jpg');
      //保存 aaa.jpg 到媒体中心
      mediacenter.save(chunk, function(error) {
          if (error) {
              console.error(error.message);
          } else {
              console.log('Resource save ok!');
          }
      }, '.jpg');

         至此,相信大家对 Media Center 的实现功能已经有一个初步认识,也对其使用方法有了部分了解。希望后期在有机会进行 EdgerOS 的 App 开发时,能对大家有所裨益。如果有要对资源媒体进行存储的需求时,可以想到和使用这个模块。

          ...全文
          52 回复 打赏 收藏 举报
          写回复
          回复
          切换为时间正序
          请发表友善的回复…
          发表回复
          发帖
          爱智开发者社区

          1528

          社区成员

          爱智开发者平台是一个开放的物联网平台,通过爱智世界,应用开发者可以把自己的应用分发到亿万用户的设备上,硬件开发者能够把设备能力开放给海量的开发者,让优质的应用脱颖而出,为用户提供更优秀的使用体验。
          边缘计算物联网javascript 企业社区
          社区管理员
          • EdgerOS
          • Lumos_zbj
          • dayinfinite
          加入社区
          帖子事件
          创建了帖子
          2022-07-01 17:01
          社区公告
          暂无公告