結合scene過濾器(用於檢測場景變化)和showinfo過濾器應該達到你想要什麼:
ffmpeg -i input.flv -filter:v "select='gt(scene,0.4)',showinfo" -f null - 2> ffout
此命令提取物是由前一幀不同的所有幀以上(gt
)0.4
(從0
到1
)。對於這些幀,信息被打印出來(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不應該輸出這樣不合格的時間戳。
上面最後的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
@keypulsations,'[。]'不匹配任何字符'.'都會。 '[。]'是一個括號表達式,它與括號內的任何單個字符匹配。另見[關於「字符類和括號表達式」的grep手冊](https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html#Character-Classes-和包圍式表達式)。雖然grep [0-9。] *'也會比浮點數和整數更匹配(但實際上並不在這個管道中),但正則表達式可能會排除整數,正如另一個答案中指出的那樣。 – ckoehn