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与Mysql的交互示例代码
Aug 18 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 NodeJs
浅谈Node的内存泄露问题
May 06 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
一个MYSQL操作类
2006/11/16 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
js自定义事件代码说明
2011/01/31 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Python3.x中自定义比较函数
2015/04/24 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
python openpyxl模块的使用详解
2021/02/25 Python
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
临床医学大学生求职信
2013/09/28 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
小学生作文评语集锦
2014/12/25 职场文书
初中同学会致辞
2015/08/01 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
深入理解go slice结构
2021/09/15 Golang
PHP正则表达式之RCEService回溯
2022/04/11 PHP