2016-02-27 163 views
8

基於這篇文章似乎它可以使用FFMPEG檢測視頻場景變化: http://www.luckydinosaur.com/u/ffmpeg-scene-change-detector使用FFMPEG:如何進行場景變化檢測?有時間碼?

現在我有一個顯示一本書的文本,當文本(單詞或句子)的視頻被說的,突出顯示。 事情是這樣的有聲書:https://youtu.be/lA7L6ZNVKjc

我需要知道的時間戳當文本被突出顯示(因此場景變化),這將允許我對我的YouTube視頻添加時間戳標記,因此它變得更容易爲聽衆導航通過有聲讀物。

什麼是魔術命令行會這樣做?

非常感謝!

回答

8

結合scene過濾器(用於檢測場景變化)和showinfo過濾器應該達到你想要什麼:

ffmpeg -i input.flv -filter:v "select='gt(scene,0.4)',showinfo" -f null - 2> ffout 

此命令提取物是由前一幀不同的所有幀以上(gt0.4(從01)。對於這些幀,信息被打印出來(showinfo)這樣

[Parsed_showinfo_1 @ 0x2d85e60] n: 0 pts:2537204 pts_time:2.5372 pos: 2998114 fmt:rgb24 sar:1/1 s:1920x1200 i:P iskey:1 type:I checksum:5616582E plane_checksum:[5616582E] 

現在你只需要提取時間戳。我想你對pts_time感興趣。你可以做這樣的:

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep [0-9.]* -o > timestamps 

這會給你所有的時間標記列表:

2.5372 
4.37799 
6.65301 
8.09344 

對於這種方法的工作,你必須有一個版本的FFmpeg的實現現場檢測。此外,您必須爲閾值選擇合適的值(第一個命令中的0.4)。您可以嘗試通過提取用於不同的閾值幀找到一個最佳的閾值(事後手動檢查幀)這樣

ffmpeg -i input.flv -filter:v "select='gt(scene,0.1)',showinfo" -vsync 0 frames/%05d.jpg 

只是爲了澄清:grep [0-9.]*,根據另一種答案不排除整數。它匹配由數字和句點組成的任何字符序列,但它也會匹配非數字,如「4.4.4」。但是,ffmpeg不應該輸出這樣不合格的時間戳。

+0

上面最後的grep應該是'grep的「[0-9] * \。[0-9] *」 -o'使最終的grep是 'grep showinfo ffout | grep pts_time:[0-9。] * -o | grep'[0-9] * \。[0-9] *'-o> timestamps' '.'需要轉義,否則匹配任何字符 – keypulsations

+1

@keypulsations,'[。]'不匹配任何字符'.'都會。 '[。]'是一個括號表達式,它與括號內的任何單個字符匹配。另見[關於「字符類和括號表達式」的grep手冊](https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html#Character-Classes-和包圍式表達式)。雖然grep [0-9。] *'也會比浮點數和整數更匹配(但實際上並不在這個管道中),但正則表達式可能會排除整數,正如另一個答案中指出的那樣。 – ckoehn

4

我沒有代表發表對上述答案的評論,但我想指出@ckoehn和@keypulsations發佈的grep將只抓取浮點時間戳。要抓住兩個浮點和整數時間戳使用下面的正則表達式

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E '[0-9]+(?:\.[0-9]*)?' -o > timestamps 
相關問題