nodejs实现截取上传视频中一帧作为预览图片


Posted in NodeJs onDecember 10, 2017

客户有个上传视频的需求,上传的视频呢,需要能在线播放并且列表中必须出现类似优酷等视频首页上的那种缩略图,成品如下图所示:

nodejs实现截取上传视频中一帧作为预览图片

当然了,上传视频的界面就不贴出来了,毕竟我们这篇文章的重点不在于如何上传,而在于如何用nodejs截取视频中的帧!~

这里我们需要一个开源的第三方插件----大名鼎鼎的多媒体编解码框架ffmpeg,需要安装在服务器上由nodejs调用,

代码贴出如下:

function fecthVideoThumbnail(entryid, index){ 
 var filename = path.join(imageDir, entryid, index + videoSuffix); 
 var thumb = path.join(imageDir, entryid, "overview",index + thumbSuffix); 
 var thumbPath = path.join(imageDir, entryid, "overview"); 
 if (!fs.existsSync(thumbPath)) { 
  <span style="white-space:pre"> </span>fs.mkdirSync(thumbPath); 
 <span style="white-space:pre"> </span>} 
 var that = this; 
 filename = filename.replaceAll("\\\\","\\\\"); 
 var cmdthumb = thumb.replaceAll("\\\\","\\\\"); 
 if(!fs.existsSync(thumb)){ 
  exec("ffmpeg -ss 00:00:10 -i "+filename+" -y -f image2 -t 0.001 "+cmdthumb+"", function() { 
    console.log(arguments[0]); 
    console.log('success'); 
    readFileEntry(thumb,that.res); 
  }); 
 }else{ 
  readFileEntry(thumb,that.res); 
 } 
  
}
function readFileEntry(filename, response) { 
 path.exists(filename, function(exists) { 
  if (!filename || !exists) { 
   response.writeHead(404); 
   response.end(); 
   return; 
  } 
  fs.readFile(filename, "binary", function(err, file) { 
   if (err) { 
    response.writeHead(404); 
    response.end(); 
    return; 
   } 
 
   var contentType = 'none'; 
   var ext = path.extname(filename); 
   switch (ext) { 
   case ".xml": 
    contentType = 'application/xml;charset=utf-8'; 
    break; 
   case ".json": 
    contentType = 'application/json;charset=utf-8'; 
    break; 
   case ".png": 
    contentType = 'image/png'; 
    break; 
   case ".jpg": 
    contentType = 'image/jpeg'; 
    break; 
   case ".flv": 
    contentType = "video/flv"; 
    break; 
   } 
    
   response.writeHead(200, { 
    'Content-Type' : contentType, 
    'Content-Length' : file.length, 
    'Accept-Ranges' : 'bytes', 
    'Server' : 'Microsoft-IIS/7.5', 
    'X-Powered-By' : 'ASP.NET' 
   }); 
   response.write(file, "binary"); 
   response.end(); 
 
  }); 
 }); 
}

重点就是这段

exec("ffmpeg -ss 00:00:10 -i "+filename+" -y -f image2 -t 0.001 "+cmdthumb+"", function() { 
    console.log(arguments[0]); 
    console.log('success'); 
    readFileEntry(thumb,that.res); 
  });

exec函数可以像cmd DOS命令台一样直接执行系统命令,ffmpeg提供的正是这样的接口。具体的API可以参照ffmpeg的文档,-ss代表指定视频初始进度,-i代表入参视频文件位置,-y代表Overwrite output files without asking.直接覆盖已存在文件而不必询问,-t代表截取时长(图片的话0.001即可),-f代表
-f fmt (input/output)
Force input or output file format. The format is normally auto detected for input files and guessed from the file extension for output files, so this option is not needed in most cases.

强制输出文件格式,基本上用不到……最后cmdthumb代表输出文件名。nodejs的exec执行完成之后,会通知回调函数。此时返回生成的缩略图即可,将此过程写成rest服务,直接将url填充在img标签的src属性中即可!

nodejs写这种服务端程序非常简单,方便,轻量。比java要简洁得多,并且不需要像tomcat那么麻烦。唯一的缺点可能就是调试比较麻烦了……

另外,上图中所示的视频服务我也是用nodejs实现的,效率还不错~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJs基本语法和类型
Feb 13 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
详解NodeJS模块化
Jun 15 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 #NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 #NodeJs
NodeJs实现定时任务的示例代码
Dec 05 #NodeJs
windows系统下更新nodejs版本的方案
Nov 24 #NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 #NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 #NodeJs
NodeJS实现视频转码的示例代码
Nov 18 #NodeJs
You might like
PHP生成Flash动画的实现代码
2010/03/12 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
企划经理的岗位职责
2013/11/17 职场文书
九年级数学教学反思
2014/02/02 职场文书
环保倡议书400字
2014/05/15 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
同学聚会祝酒词
2015/08/10 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
详解redis分布式锁的这些坑
2021/05/19 Redis
Python一行代码实现自动发邮件功能
2021/05/30 Python