2016-02-27 6 views
8

zu diesem Artikel Auf der Basis scheint es, dass es möglich ist, FFMPEG zu verwenden Szenenwechsel in Videos zu erkennen: http://www.luckydinosaur.com/u/ffmpeg-scene-change-detectorVerwenden von FFMPEG: Wie wird eine Szenenänderungserkennung durchgeführt? mit Timecode?

Jetzt habe ich ein Video, das ein Buch Text und wenn der Text (Wort oder Satz) zeigt es gesprochen wird wird hervorgehoben. So etwas wie dieses Hörbuchs: https://youtu.be/lA7L6ZNVKjc

Ich brauche den Zeitstempel wissen, wann der Text (daher Szenenwechsel) hervorgehoben wird, wird dies erlauben Sie mir, Zeitstempel-Tags auf meinem Youtube-Video hinzufügen, so dass es leichter wird, für die Zuhörer zu navigieren durch das Hörbuch.

Was ist die magische Befehlszeile, die dies tun würde?

Vielen Dank!

Antwort

8

Die Kombination der scene Filter (für Szenenwechsel Erkennung) und der showinfo Filter sollte erreichen, was Sie wollen:

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

Dieser Befehl extrahiert alle Frames, die von aus dem vorhergehenden Rahmen unterscheiden sich mehr als (gt) 0.4 (auf einer Skala von 0 bis 1). Für diese Rahmen werden Informationen ausgedruckt (showinfo) wie dieses

[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] 

Jetzt müssen Sie nur den Zeitstempel extrahieren. Ich glaube, Sie interessieren sich für pts_time. Man könnte es wie folgt tun:

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

Dies wird Ihnen die Liste aller Zeitstempel:

2.5372 
4.37799 
6.65301 
8.09344 

für diesen Ansatz zu arbeiten, müssen Sie eine Version von FFmpeg haben, die die Szenenerkennung implementiert. Außerdem müssen Sie einen geeigneten Wert für den Schwellenwert auswählen (0.4 im ersten Befehl). Sie können versuchen, einen optimalen Schwellenwert zu finden, indem Rahmen für unterschiedliche Schwellenwerte Extrahieren (und danach die Rahmen manuell prüfen) wie diese zur Klärung

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

Nur: grep [0-9.]* keine ganzen Zahlen nicht ausschließen, wie in einer anderen Antwort beansprucht. Es entspricht einer beliebigen Zeichenfolge aus Ziffern und Punkten, aber es würde auch Nicht-Zahlen wie '4.4.4' entsprechen. Ffmpeg sollte jedoch solche schlecht geformten Zeitstempel nicht ausgeben.

+0

der letzte grep oben sollte 'grep Bé [0-9] * \. [0-9] * '-o' so dass die endgültige grep ist 'grep showinfo ffout | grep pts_time: [0-9.] * -o | grep '[0-9] * \. [0-9] *' -o> Zeitstempel' das '.' muss maskiert werden, sonst entspricht es einem beliebigen Zeichen – keypulsations

+1

@keypulsations,' [.] 'stimmt nicht überein jedes Zeichen '.' tut. '[.]' ist ein Klammerausdruck, der jedem einzelnen Zeichen zwischen den Klammern entspricht.Siehe auch [das grep-Handbuch zu "Zeichenklassen und Klammerausdrücke"] (https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html#Character-Classes- und-Klammer-Ausdrücke). Während 'grep [0-9.] *' Auch mehr als Floats und Integer (aber in Wirklichkeit nicht in dieser Pipeline) entspricht, könnte Ihr Regexp ganze Zahlen ausschließen, wie in der anderen Antwort angegeben. – ckoehn

4

Ich habe nicht die rep, um einen Kommentar zu der obigen Antwort zu posten, aber ich wollte darauf hinweisen, dass die grep von @ckehn und @keypulsations nur Zeitstempeln, die Fließkommazahl sind packte. Greifen beide Gleitkomma- und Ganzzahl-Zeitstempel verwenden, um die folgenden regex

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E '[0-9]+(?:\.[0-9]*)?' -o > timestamps 
Verwandte Themen