再長的視頻一眼看完

前言

周末在家無事,室友在聚精會神的看綜藝節(jié)目,時不時還暫停記下筆記。

我就問她在干嘛,她說接了一個活,是要統(tǒng)計節(jié)目中某個廣告出現(xiàn)的次數(shù)和時間,最后匯總成一個表格。

我說這還不簡單,把視頻每一幀都截圖下來,直接對著看就可以了呀。

所以你看,當程序員的好處就是可以隨便的信口開河,壞處就是自己說的話還是要自己去圓。

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

FFmpeg

一開始搜索的關(guān)鍵詞是“chrome 視頻 截圖”,想法是通過chrome插件的形式完成截圖。找到了一些現(xiàn)成的插件,但是關(guān)于原理性的東西基本沒有查到,而且flash播放器的截圖也都十分麻煩,看起來不像是只用js就搞得定的事情,于是想到曲線救國,先把視頻弄到本地,然后對本地的視頻文件做解析。果然就找到了一個類庫:FFmpeg

維基百科百度百科可以看到一些關(guān)于FFmpeg這個項目的介紹。這是一個非常古老的項目,幾乎覆蓋了視頻解碼所有的需求,很有意思的是,項目有一個恥辱柱(Hall Of Shame),點名批評了很多使用了改項目,但是沒有遵循其開源協(xié)議的軟件,很多大家耳熟能詳?shù)牟シ牌鞫济衅渲小?/p>

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

由于FFmpeg是在LGPL/GPL協(xié)議下發(fā)布的(如果使用了其中一些使用GPL協(xié)議發(fā)布的模塊則必須使用GPL協(xié)議),任何人都可以自由使用,但必須嚴格遵守LGPL/GPL協(xié)議。有很多播放軟件都使用了FFmpeg的代碼,但它們并沒有遵守LGPL/GPL協(xié)議,沒有公開任何源代碼。我們應(yīng)該對這種侵權(quán)行為表示恥辱。

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

2009年2月,韓國名軟KMPlayer被FFmpeg開源項目發(fā)現(xiàn)使用了它們的代碼和二進制文件,但是沒有按照規(guī)定/慣例開放相應(yīng)說明/源碼。因此被人舉報,進入了FFmpeg官網(wǎng)上的恥辱黑名單。

2009年5月,網(wǎng)友cehoyos下載了暴風影音軟件,解壓之后發(fā)現(xiàn)其安裝程序內(nèi)包含了大量的開源和私有解碼器:avcodec,avformat,avutil,x264,xvid,bass,wmvdmod等,之后暴風影音被正式加入到FFmpeg恥辱名單。

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

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

Libav項目啟動之后,F(xiàn)Fmpeg官方版本也仍然在一直維護中。FFmpeg與libav屬于獨立的兩個項目。

ffmpeg提供了控制臺的版本,在官網(wǎng)提供下載,自然而然會想到,是不是有nodejs的版本,于是上npm搜索,找到了幾個相關(guān)的類庫,分別點進github主頁,從中挑選了一個star數(shù)最多的項目node-fluent-ffmpeg(截止發(fā)文時,Star1543)

node-fluent-ffmpeg還是要依賴控制臺版的FFmpeg。

去官網(wǎng)下載一個build版的FFmpeg(以windows為例)
在打開的頁面中,選擇static版
添加解壓路徑到環(huán)境變量中

這時在cmd中輸入ffmpeg,應(yīng)該可以看到版本信息


在項目文件夾內(nèi)輸入npm i node-fluent-ffmpeg -save引入類庫,cd. >index.js創(chuàng)建新的腳本文件,準備開工。

腳本編寫

在FFmpeg的github項目頁有很詳細的文檔,我們需要的是截屏功能,也就是screenshot,直接在頁內(nèi)搜索關(guān)鍵字,然后我們可以看到示例代碼如下:

獲取截屏

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'
  });

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

我們的思路是,把截圖功能封裝成一個函數(shù),把每一秒作為時間參數(shù)傳入,同時也把格式化后的時間作為文件名進行保存。

獲取視頻信息

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

metadata可以拿到很多視頻相關(guān)的信息,我們目前就只需要視頻長度

完整代碼的:傳送門

完成之后大概是這個效果


每一幀都是按時間命名的,可以方便的檢索到內(nèi)容。如果對時間精度要求比較高,F(xiàn)Fmpeg是支持到毫秒級的截圖。

結(jié)尾

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

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

或者做電影簡介之類的文章,可以快速的找到關(guān)鍵劇情的截圖,拼接出文章。

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

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

發(fā)現(xiàn)真的是一部葫蘆娃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容