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异步回调的优雅处理方法
Sep 25 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
Nodejs实现用户注册功能
Apr 14 NodeJs
Nodejs环境实现socket通信过程解析
Jul 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分页显示制作详细讲解
2008/11/19 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
javascript 闭包疑问
2010/12/30 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
Vue基础配置讲解
2019/11/29 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
python中scikit-learn机器代码实例
2018/08/05 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
django fernet fields字段加密实践详解
2019/08/12 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
应届生面试求职信
2014/07/02 职场文书
建筑工地文明标语
2014/10/09 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
python cv2图像质量压缩的算法示例
2021/06/04 Python