Si tratta di una vecchia questione, ma non ho ancora trovato documentato da nessuna parte.
Ho trovato che la seguente lavorato su un video gioco con Gstreamer 1,0
import gi
import time
gi.require_version('Gst', '1.0')
from gi.repository import Gst
def get_frame():
caps = Gst.Caps('image/png')
pipeline = Gst.ElementFactory.make("playbin", "playbin")
pipeline.set_property('uri','file:///home/rolf/GWPE.mp4')
pipeline.set_state(Gst.State.PLAYING)
#Allow time for it to start
time.sleep(0.5)
# jump 30 seconds
seek_time = 30 * Gst.SECOND
pipeline.seek(1.0, Gst.Format.TIME,(Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE),Gst.SeekType.SET, seek_time , Gst.SeekType.NONE, -1)
#Allow video to run to prove it's working, then take snapshot
time.sleep(1)
buffer = pipeline.emit('convert-sample', caps)
buff = buffer.get_buffer()
result, map = buff.map(Gst.MapFlags.READ)
if result:
data = map.data
pipeline.set_state(Gst.State.NULL)
return data
else:
return
if __name__ == '__main__':
Gst.init(None)
image = get_frame()
with open('frame.png', 'wb') as snapshot:
snapshot.write(image)
Il codice dovrebbe funzionare sia con python2 e python3, spero che aiuta qualcuno.
fonte
2017-10-17 15:03:18
Si noti che "5 secondi" probabilmente non funzionerà. Per molti film commerciali, avrai solo l'introduzione/logo. Prova a trovare cornici nere (indicano i cambi di scena) e poi cerca alcuni secondi nella scena. Offri all'utente 4-5 di quelli per trovare un'immagine che sia facile da riconoscere. –
Questo è per i video personali che durano più di 5 secondi. In ogni caso, la cifra di 5 secondi è arbitraria e per l'esempio. Potrebbe essere 2, 10 o qualsiasi altro valore sotto, diciamo, 30 secondi. –