To stare pytanie, ale ja nadal nie znalazłem to udokumentowane w dowolnym miejscu.
Okazało się, że następuje pracował na gry wideo z 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)
Kod powinien pracować zarówno python2 i Python3, mam nadzieję, że ktoś pomoże.
Pamiętaj, że "5 sekund" prawdopodobnie nie będzie działać. W przypadku wielu komercyjnych filmów dostaniesz tylko intro/logo. Spróbuj znaleźć czarne ramki (wskazują zmiany sceny), a następnie poszukaj kilku sekund w scenie. Zaoferuj użytkownikowi 4-5 z nich, aby znaleźć obraz, który jest łatwy do rozpoznania. –
Ta funkcja jest przeznaczona do osobistych filmów wideo, które trwają dłużej niż 5 sekund. W każdym razie, liczba 5 sekund jest po prostu dowolna i ze względu na przykład. Może to być 2, 10 lub jakakolwiek inna wartość poniżej, powiedzmy, 30 sekund. –