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学习笔记之测试驱动
Apr 16 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
nodejs简单抓包工具使用详解
Aug 23 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
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
python迭代器的使用方法实例
2013/11/21 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
python实现银行账户系统
2021/02/22 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
企业行政文员岗位职责
2013/12/03 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
毕业证明书
2015/06/19 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL