前言
周末在家無事秒旋,室友在聚精會(huì)神的看綜藝節(jié)目,時(shí)不時(shí)還暫停記下筆記裳涛。
我就問她在干嘛木张,她說接了一個(gè)活,是要統(tǒng)計(jì)節(jié)目中某個(gè)廣告出現(xiàn)的次數(shù)和時(shí)間调违,最后匯總成一個(gè)表格窟哺。
我說這還不簡(jiǎn)單,把視頻每一幀都截圖下來技肩,直接對(duì)著看就可以了呀。
所以你看浮声,當(dāng)程序員的好處就是可以隨便的信口開河虚婿,壞處就是自己說的話還是要自己去圓。
雖然說話的時(shí)候我也不知道怎么做這樣的事情泳挥,不過有萬能的谷歌和github然痊,相信不是什么難事。
FFmpeg
一開始搜索的關(guān)鍵詞是“chrome 視頻 截圖”屉符,想法是通過chrome插件的形式完成截圖剧浸。找到了一些現(xiàn)成的插件,但是關(guān)于原理性的東西基本沒有查到矗钟,而且flash播放器的截圖也都十分麻煩唆香,看起來不像是只用js就搞得定的事情,于是想到曲線救國(guó)吨艇,先把視頻弄到本地躬它,然后對(duì)本地的視頻文件做解析。果然就找到了一個(gè)類庫:FFmpeg
在維基百科和百度百科可以看到一些關(guān)于FFmpeg這個(gè)項(xiàng)目的介紹东涡。這是一個(gè)非常古老的項(xiàng)目冯吓,幾乎覆蓋了視頻解碼所有的需求,很有意思的是疮跑,項(xiàng)目有一個(gè)恥辱柱(Hall Of Shame)组贺,點(diǎn)名批評(píng)了很多使用了改項(xiàng)目,但是沒有遵循其開源協(xié)議的軟件祖娘,很多大家耳熟能詳?shù)牟シ牌鞫济衅渲小?/p>
(Hall Of Shame)
FFmpeg被許多開源項(xiàng)目采用失尖,比如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é)議)雹仿,任何人都可以自由使用增热,但必須嚴(yán)格遵守LGPL/GPL協(xié)議。有很多播放軟件都使用了FFmpeg的代碼胧辽,但它們并沒有遵守LGPL/GPL協(xié)議峻仇,沒有公開任何源代碼。我們應(yīng)該對(duì)這種侵權(quán)行為表示恥辱邑商。
2009年加入FFmpeg的播放軟件:暴風(fēng)影音摄咆、QQ影音、KMP人断、GOM Player吭从、PotPlayer(2010)都在其列。
2009年2月恶迈,韓國(guó)名軟KMPlayer被FFmpeg開源項(xiàng)目發(fā)現(xiàn)使用了它們的代碼和二進(jìn)制文件涩金,但是沒有按照規(guī)定/慣例開放相應(yīng)說明/源碼。因此被人舉報(bào)暇仲,進(jìn)入了FFmpeg官網(wǎng)上的恥辱黑名單步做。
2009年5月,網(wǎng)友cehoyos下載了暴風(fēng)影音軟件奈附,解壓之后發(fā)現(xiàn)其安裝程序內(nèi)包含了大量的開源和私有解碼器:avcodec全度,avformat,avutil斥滤,x264将鸵,xvid,bass佑颇,wmvdmod等顶掉,之后暴風(fēng)影音被正式加入到FFmpeg恥辱名單。
2009年7月22日漩符,陳俊豪(格式工廠作者)因用到了ffmpeg和RMVB的編碼庫一喘,用到了FFmpeg的譯碼/編碼算法,違反FFmpeg的LGPL協(xié)議嗜暴,登上了2009年7月22日FFmpeg的“恥辱柱”上凸克。
2009年11月,網(wǎng)友roo_zhou向FFmpeg舉報(bào)闷沥,指出QQ影音的credit只給出了修改的FFmpeg源碼下載萎战,聲稱是LGPL許可證。但實(shí)際是修改過的ffdshow舆逃,采用的是GPL許可證蚂维,之后QQ影音被正式加入到FFmpeg恥辱名單之列戳粒。
Libav項(xiàng)目啟動(dòng)之后,F(xiàn)Fmpeg官方版本也仍然在一直維護(hù)中虫啥。FFmpeg與libav屬于獨(dú)立的兩個(gè)項(xiàng)目蔚约。
ffmpeg提供了控制臺(tái)的版本,在官網(wǎng)提供下載涂籽,自然而然會(huì)想到苹祟,是不是有nodejs的版本,于是上npm搜索评雌,找到了幾個(gè)相關(guān)的類庫树枫,分別點(diǎn)進(jìn)github主頁,從中挑選了一個(gè)star數(shù)最多的項(xiàng)目node-fluent-ffmpeg(截止發(fā)文時(shí)景东,Star1543)
node-fluent-ffmpeg還是要依賴控制臺(tái)版的FFmpeg砂轻。
這時(shí)在cmd中輸入ffmpeg
斤吐,應(yīng)該可以看到版本信息
在項(xiàng)目文件夾內(nèi)輸入npm i node-fluent-ffmpeg -save
引入類庫搔涝,cd. >index.js
創(chuàng)建新的腳本文件,準(zhǔn)備開工曲初。
腳本編寫
在FFmpeg的github項(xiàng)目頁有很詳細(xì)的文檔体谒,我們需要的是截屏功能,也就是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í)間,文件名傀广,輸出路徑和尺寸颁独。
我們的思路是,把截圖功能封裝成一個(gè)函數(shù)伪冰,把每一秒作為時(shí)間參數(shù)傳入誓酒,同時(shí)也把格式化后的時(shí)間作為文件名進(jìn)行保存。
獲取視頻信息
ffmpeg.ffprobe('VIDEO_NAME', function(err, metadata) {
console.log(metadata);
console.log(metadata.format.duration);
});
metadata可以拿到很多視頻相關(guān)的信息贮聂,我們目前就只需要視頻長(zhǎng)度
完整代碼的:傳送門
完成之后大概是這個(gè)效果
每一幀都是按時(shí)間命名的靠柑,可以方便的檢索到內(nèi)容。如果對(duì)時(shí)間精度要求比較高吓懈,F(xiàn)Fmpeg是支持到毫秒級(jí)的截圖歼冰。
結(jié)尾
這個(gè)東西除了給室友用來看廣告以外還能有什么用處呢,我大概想了幾個(gè)方向耻警。
比如可以把下載的教育視頻(真的是說教育視頻)截圖隔嫡,直接選取有PPT的幾頁保存下來甸怕,可以快速的得到課堂筆記。
或者做電影簡(jiǎn)介之類的文章腮恩,可以快速的找到關(guān)鍵劇情的截圖梢杭,拼接出文章。
其他的暫時(shí)就想不到什么更有意義的事情了秸滴。
閑來無事武契,我把下載下來的葫蘆娃跑了一下腳本。
發(fā)現(xiàn)真的是一部葫蘆娃缸榛。