How to create video thumbnails with Python and Gstreamer
gstreamer, python, video
Solution
To elaborate on ensonic's answer, here's an example:
import os
import sys
import gst
def get_frame(path, offset=5, caps=gst.Caps('image/png')):
pipeline = gst.parse_launch('playbin2')
pipeline.props.uri = 'file://' + os.path.abspath(path)
pipeline.props.audio_sink = gst.element_factory_make('fakesink')
pipeline.props.video_sink = gst.element_factory_make('fakesink')
pipeline.set_state(gst.STATE_PAUSED)
# Wait for state change to finish.
pipeline.get_state()
assert pipeline.seek_simple(
gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, offset * gst.SECOND)
# Wait for seek to finish.
pipeline.get_state()
buffer = pipeline.emit('convert-frame', caps)
pipeline.set_state(gst.STATE_NULL)
return buffer
def main():
buf = get_frame(sys.argv[1])
with file('frame.png', 'w') as fh:
fh.write(str(buf))
if __name__ == '__main__':
main()
This generates a PNG image. You can get raw image data using `gst.Caps("video/x-raw-rgb,bpp=24,depth=24")` or something like that.
Note that in GStreamer 1.0 (as opposed to 0.10), `playbin2` has been renamed to `playbin` and the `convert-frame` signal is named `convert-sample`.
The mechanics of seeking are explained in this chapter of the GStreamer Application Development Manual. The 0.10 `playbin2` documentation no longer seems to be online, but the documentation for 1.0 is here.
Problem
I'd like to create thumbnails for MPEG-4 AVC videos using Gstreamer and Python. Essentially: - Open the video file - Seek to a certain point in time (e.g. 5 seconds) - Grab the frame at that time - Save the frame to disc as a .jpg file I've been looking at this other similar question, but I cannot quite figure out how to do the seek and frame capture automatically without user input. So in summary, how can I capture a video thumbnail with Gstreamer and Python as per the steps above?