nodejs實現(xiàn)截取上傳視頻中一幀作為預覽圖片
客戶有個上傳視頻的需求,上傳的視頻呢,需要能在線播放并且列表中必須出現(xiàn)類似優(yōu)酷等視頻首頁上的那種縮略圖,成品如下圖所示:
當然了,上傳視頻的界面就不貼出來了,畢竟我們這篇文章的重點不在于如何上傳,而在于如何用nodejs截取視頻中的幀!~
這里我們需要一個開源的第三方插件----大名鼎鼎的多媒體編解碼框架ffmpeg,需要安裝在服務器上由nodejs調(diào)用,
代碼貼出如下:
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函數(shù)可以像cmd DOS命令臺一樣直接執(zhí)行系統(tǒng)命令,ffmpeg提供的正是這樣的接口。具體的API可以參照ffmpeg的文檔,-ss代表指定視頻初始進度,-i代表入?yún)⒁曨l文件位置,-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執(zhí)行完成之后,會通知回調(diào)函數(shù)。此時返回生成的縮略圖即可,將此過程寫成rest服務,直接將url填充在img標簽的src屬性中即可!
nodejs寫這種服務端程序非常簡單,方便,輕量。比java要簡潔得多,并且不需要像tomcat那么麻煩。唯一的缺點可能就是調(diào)試比較麻煩了……
另外,上圖中所示的視頻服務我也是用nodejs實現(xiàn)的,效率還不錯~
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式
這篇文章主要介紹了Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10node.js連接mongoDB數(shù)據(jù)庫 快速搭建自己的web服務
這篇文章主要為大家詳細介紹了node.js連接mongoDB數(shù)據(jù)庫,如何快速搭建自己的web服務,感興趣的小伙伴們可以參考一下2016-04-04window系統(tǒng)管理多版本node的實現(xiàn)
存在不同項目使用npm時所需要的版本不一致,又不想每次都卸載又重新安裝node,這時候就需要多版本管理器,本文主要介紹了window系統(tǒng)管理多版本node的實現(xiàn),感興趣的可以了解一下2024-02-02nodejs中內(nèi)置模塊fs,path常見的用法說明
這篇文章主要介紹了nodejs中內(nèi)置模塊fs,path常見的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11npm?install?-g?@vue/cli常見問題解決匯總
這篇文章主要給大家介紹了關于npm?install?-g?@vue/cli常見問題解決的相關資料,文中通過實例代碼將解決的方式介紹的非常詳細,對遇到這個問題的朋友具有一定的參考學習價值,需要的朋友可以參考下2022-08-08