客户有个上传视频的需求,上传的视频呢,需要能在线播放并且列表中必须出现类似优酷等视频首页上的那种缩略图,成品如下图所示:
当然了,上传视频的界面就不贴出来了,毕竟我们这篇文章的重点不在于如何上传,而在于如何用nodejs截取视频中的帧! ~
这里我们需要一个开源的第三方插件——大名鼎鼎的多媒体编解码框架ffmpeg,需要安装在服务器上由nodejs调用,
代码贴出如下:
指数函数fecthVideoThumbnail (entryid) { var=文件名的路径。加入(imageDir、entryid、索引+ videoSuffix); var拇指=路径。加入(imageDir entryid,“概述”,指数+ thumbSuffix); var thumbPath=路径。加入(imageDir entryid,“概述”); 如果(! fs.existsSync (thumbPath)) { & lt;跨度比;& lt;/span> fs.mkdirSync (thumbPath); & lt;跨度比;& lt;/span>} var=这个; 文件名=filename.replaceAll (“\ \ \ \”,“\ \ \ \”); var cmdthumb=thumb.replaceAll (“\ \ \ \”,“\ \ \ \”); 如果(! fs.existsSync(拇指)){ exec (“ffmpeg党卫军00:00:10我”+文件名+“- y - f image2 - t 0.001”+ cmdthumb + ",函数(){ console.log(参数[0]); console.log('成功'); readFileEntry(拇指,that.res); }); 其他}{ readFileEntry(拇指,that.res); } }
函数readFileEntry(文件名、响应){ 路径。存在(文件名,函数(存在){ 如果(!){存在文件名| | ! response.writeHead (404); response.end (); 返回; } fs。readFile函数的文件名,“二进制”,(呃,文件){ 如果(err) { response.writeHead (404); response.end (); 返回; } var contentType='没有'; var ext=path.extname(文件名); 开关(ext) { 例“xml”: contentType=癮pplication/xml; charset=utf - 8”; 打破; 案例" . json ": contentType=癮pplication/json; charset=utf - 8”; 打破; 例“中将”: contentType=巴枷?png”; 打破; 例“jpg”: contentType=巴枷?jpeg”; 打破; 例“。”: contentType="视频/flv”; 打破; } 响应。writeHead(200年,{ “内容类型”:contentType, “内容长度”:file.length, “Accept-Ranges”:“字节”, “服务器”:“microsoft iis/7.5”, “X-Powered-By”:“ASP.NET” }); 响应。写(文件、“二进制”); response.end (); }); }); }
重点就是这段
exec (“ffmpeg党卫军00:00:10我”+文件名+“- y - f image2 - t 0.001”+ cmdthumb + ",函数(){ console.log(参数[0]); console.log('成功'); readFileEntry(拇指,that.res); }); >之前执行函数可以像cmd DOS命令台一样直接执行系统命令,ffmpeg提供的正是这样的接口。具体的API可以参照ffmpeg的文档,党卫军代表指定视频初始进度,我代表入参视频文件位置,- y代表覆盖输出文件没有要求。直接覆盖已存在文件而不必询问,- t代表截取时长(图片的0.001话即可),- f代表
- f fmt(输入/输出)
力输入或输出文件格式。格式通常是汽车检测到输入文件和输出文件的文件扩展名,猜这选项在大多数情况下不需要。强制输出文件格式,基本上用不到……最后cmdthumb代表输出文件名.nodejs的exec执行完成之后,会通知回调函数。此时返回生成的缩略图即可,将此过程写成其他服务,直接将url填充在img标签的src属性中即可。
nodejs写这种服务端程序非常简单,方便,轻量,比java要简洁得多,并且不需要像tomcat那么麻烦。唯一的缺点可能就是调试比较麻烦了……
另外,上图中所示的视频服务我也是用nodejs实现的,效率还不错~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
nodejs实现截取上传视频中一帧作为预览图片