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连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
Nodejs之http的表单提交
Jul 07 NodeJs
让nodeJS支持ES6的词法----babel的安装和使用方法
Jul 31 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 05 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 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过滤危险html代码
2008/08/18 PHP
php 如何获取数组第一个值
2013/08/06 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
js 小数取整的函数
2010/05/10 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
python里反向传播算法详解
2020/11/22 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
陈欧广告词
2014/03/14 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
区级文明单位申报材料
2014/05/15 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
2014年团工作总结
2014/11/27 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
南京南京观后感
2015/06/02 职场文书
教师培训学习心得体会
2016/01/21 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL