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服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
nodejs开发微博实例
Mar 25 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 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
第九节--绑定
2006/11/16 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
日期 时间js控件
2009/05/07 Javascript
js 居中漂浮广告
2010/03/21 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
解决python 文本过滤和清理问题
2019/08/28 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
会计自荐信范文
2014/03/09 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
小学教师教学随笔
2015/08/14 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
学校教代会开幕词
2016/03/04 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android