再長的視頻一眼看完

前言

週末在家無事,室友在聚精會神的看綜藝節目,時不時還暫停記下筆記。javascript

我就問她在幹嗎,她說接了一個活,是要統計節目中某個廣告出現的次數和時間,最後彙總成一個表格。html

我說這還不簡單,把視頻每一幀都截圖下來,直接對着看就能夠了呀。java

因此你看,當程序員的好處就是能夠隨便的信口開河,壞處就是本身說的話仍是要本身去圓。node

雖說話的時候我也不知道怎麼作這樣的事情,不過有萬能的谷歌和github,相信不是什麼難事。git

FFmpeg

一開始搜索的關鍵詞是「chrome 視頻 截圖」,想法是經過chrome插件的形式完成截圖。找到了一些現成的插件,可是關於原理性的東西基本沒有查到,並且flash播放器的截圖也都十分麻煩,看起來不像是隻用js就搞得定的事情,因而想到曲線救國,先把視頻弄到本地,而後對本地的視頻文件作解析。果真就找到了一個類庫:FFmpeg程序員

維基百科百度百科能夠看到一些關於FFmpeg這個項目的介紹。這是一個很是古老的項目,幾乎覆蓋了視頻解碼全部的需求,頗有意思的是,項目有一個恥辱柱(Hall Of Shame),點名批評了不少使用了改項目,可是沒有遵循其開源協議的軟件,不少你們耳熟能詳的播放器都名列其中。github

(Hall Of Shame) FFmpeg被許多開源項目採用,好比ffmpeg2theora,VLC, MPlayer, HandBrake, Blender, Google Chrome等。還有DirectShow/VFW的ffdshow(external project)和QuickTime的Perian (external project)也採用了FFmpeg。算法

因爲FFmpeg是在LGPL/GPL協議下發布的(若是使用了其中一些使用GPL協議發佈的模塊則必須使用GPL協議),任何人均可以自由使用,但必須嚴格遵照LGPL/GPL協議。有不少播放軟件都使用了FFmpeg的代碼,但它們並無遵照LGPL/GPL協議,沒有公開任何源代碼。咱們應該對這種侵權行爲表示恥辱。chrome

2009年加入FFmpeg的播放軟件:暴風影音、QQ影音、KMP、GOM Player、PotPlayer(2010)都在其列。npm

2009年2月,韓國名軟KMPlayer被FFmpeg開源項目發現使用了它們的代碼和二進制文件,可是沒有按照規定/慣例開放相應說明/源碼。所以被人舉報,進入了FFmpeg官網上的恥辱黑名單。

2009年5月,網友cehoyos下載了暴風影音軟件,解壓以後發現其安裝程序內包含了大量的開源和私有解碼器:avcodec,avformat,avutil,x264,xvid,bass,wmvdmod等,以後暴風影音被正式加入到FFmpeg恥辱名單。

2009年7月22日,陳俊豪(格式工廠做者)因用到了ffmpeg和RMVB的編碼庫,用到了FFmpeg的譯碼/編碼算法,違反FFmpeg的LGPL協議,登上了2009年7月22日FFmpeg的「恥辱柱」上。

2009年11月,網友roo_zhou向FFmpeg舉報,指出QQ影音的credit只給出了修改的FFmpeg源碼下載,聲稱是LGPL許可證。但實際是修改過的ffdshow,採用的是GPL許可證,以後QQ影音被正式加入到FFmpeg恥辱名單之列。

Libav項目啓動以後,FFmpeg官方版本也仍然在一直維護中。FFmpeg與libav屬於獨立的兩個項目。

ffmpeg提供了控制檯的版本,在官網提供下載,天然而然會想到,是否是有nodejs的版本,因而上npm搜索,找到了幾個相關的類庫,分別點進github主頁,從中挑選了一個star數最多的項目node-fluent-ffmpeg(截止發文時,Star1543)

node-fluent-ffmpeg仍是要依賴控制檯版的FFmpeg。

首先去官網下載一個build版的FFmpeg(以windows爲例)

在打開的頁面中,選擇static版

添加解壓路徑到環境變量中

這時在cmd中輸入ffmpeg,應該能夠看到版本信息

 在項目文件夾內輸入npm i node-fluent-ffmpeg -save引入類庫,cd. >index.js建立新的腳本文件,準備開工。

腳本編寫

在FFmpeg的github項目頁有很詳細的文檔,咱們須要的是截屏功能,也就是screenshot,直接在頁內搜索關鍵字,而後咱們能夠看到示例代碼以下:

獲取截屏

ffmpeg('/path/to/video.avi')
  .on('filenames', function(filenames) {
    console.log('Will generate ' + filenames.join(', '))
  })
  .on('end', function() {
    console.log('Screenshots taken');
  })
  .screenshots({
    // Will take screens at 20%, 40%, 60% and 80% of the video
    count: 4,
    folder: '/path/to/output'
  });

ffmpeg('/path/to/video.avi')
  .screenshots({
    timestamps: [30.5, '50%', '01:10.123'],
    filename: 'thumbnail-at-%s-seconds.png',
    folder: '/path/to/output',
    size: '320x240'
  });複製代碼

能夠看到,操做是流式的,截圖能夠自定義時間,文件名,輸出路徑和尺寸。

咱們的思路是,把截圖功能封裝成一個函數,把每一秒做爲時間參數傳入,同時也把格式化後的時間做爲文件名進行保存。

獲取視頻信息

ffmpeg.ffprobe('VIDEO_NAME', function(err, metadata) {
    console.log(metadata);
    console.log(metadata.format.duration);
});複製代碼

metadata能夠拿到不少視頻相關的信息,咱們目前就只須要視頻長度

完整代碼的:傳送門

完成以後大概是這個效果

每一幀都是按時間命名的,能夠方便的檢索到內容。若是對時間精度要求比較高,FFmpeg是支持到毫秒級的截圖。

結尾

這個東西除了給室友用來看廣告之外還能有什麼用處呢,我大概想了幾個方向。

好比能夠把下載的教育視頻(真的是說教育視頻)截圖,直接選取有PPT的幾頁保存下來,能夠快速的獲得課堂筆記。

或者作電影簡介之類的文章,能夠快速的找到關鍵劇情的截圖,拼接出文章。

其餘的暫時就想不到什麼更有意義的事情了。

閒來無事,我把下載下來的葫蘆娃跑了一下腳本。

發現真的是一部葫蘆娃。

相關文章
相關標籤/搜索