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?

Original source