1,582
社区成员




谈起 Node.js,大多数人了解它是一个常见操作系统中的 JavaScript 运行环境,与之对应 EdgerOS 智能边缘计算操作系统也有一个内置的 JavaScript 运行环境 JSRE。而 Node.js 之所以能被广为人知很大程度上是因为它本身的模块系统能为开发者提供大量的模块, 如 fs , http 等。同样,JSRE 也为广大开发者提供了许多高效,易用的模块,Media Center 即为这些模块中的一员。
当开发人员在开发应用时,时常有媒体资源保存和读取的需求,此时应该使用什么样的文件结构存储这些资源文件,又应该如何高效地索引资源文件?为了解决这个问题,EdgerOS 为爱智应用提供了媒体资源仓库 —— Media Center;爱智应用直接引入这个模块就能非常方便且保存和读取共享的媒体资源。
const MediaCenter = require('mediacenter');
//or
const MediaCenter = require('async/mediacenter');
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'`);
callback {Function} 回调函数
error {Error} 错误处理
list {Array} 媒体集合列表.
condition {String} 统计搜索条件. 默认为:unconditional
在指定条件下从媒体中心获取媒体集合列表。
示例如下:
mediacenter.albums(function(error, list) {
if (Array.isArray(list)) {
console.log('All albums:', list);
}
});
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);
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} 经度
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);
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 对缩略图选项无效。
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 开发时,能对大家有所裨益。如果有要对资源媒体进行存储的需求时,可以想到和使用这个模块。