91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs實現截取上傳視頻中一幀作為預覽圖片

發布時間:2020-09-27 10:58:32 來源:腳本之家 閱讀:265 作者:yanglang1987500 欄目:web開發

客戶有個上傳視頻的需求,上傳的視頻呢,需要能在線播放并且列表中必須出現類似優酷等視頻首頁上的那種縮略圖,成品如下圖所示:

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 > </span>fs.mkdirSync(thumbPath); 
 <span > </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實現的,效率還不錯~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丽水市| 方正县| 吉林市| 峡江县| 弥勒县| 沁阳市| 长垣县| 文山县| 会同县| 梧州市| 宁安市| 当涂县| 夏邑县| 杂多县| 诸暨市| 景洪市| 阜南县| 五莲县| 宜州市| 旅游| 玛多县| 榆中县| 莲花县| 屯昌县| 镇安县| 博乐市| 南岸区| 荣昌县| 福安市| 玉田县| 磐安县| 安国市| 石泉县| 佳木斯市| 比如县| 炎陵县| 翁牛特旗| 聊城市| 涿州市| 伊川县| 嘉禾县|