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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
nodejs实现黑名单中间件设计
Jun 17 NodeJs
nodejs加密Crypto的实例代码
Jul 07 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
nodejs中使用worker_threads来创建新的线程的方法
Jan 22 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
JS上传前预览图片实例
2013/03/25 Javascript
js Calender控件使用详解
2015/01/05 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
Python中分数的相关使用教程
2015/03/30 Python
python插入数据到列表的方法
2015/04/30 Python
Python从零开始创建区块链
2018/03/06 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
pycharm显示远程图片的实现
2019/11/04 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
实习科室评语
2015/01/04 职场文书
职工食堂管理制度
2015/08/06 职场文书
早安问候语大全
2015/11/10 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python
APP界面设计技巧和注意事项
2022/04/29 杂记
delete in子查询不走索引问题分析
2022/07/07 MySQL