且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使用Python和Gstreamer创建视频缩略图

更新时间:2022-05-27 01:09:43

要详细说明 ensonic 的答案,这是一个例子:

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()

这将生成一个PNG图像.您可以使用gst.Caps("video/x-raw-rgb,bpp=24,depth=24")或类似的方法获取原始图像数据.

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.

请注意,在GStreamer 1.0(而不是0.10)中,playbin2已重命名为playbin,并且convert-frame信号被命名为convert-sample.

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.

GStreamer应用程序开发手册的这一章. 0.10 playbin2文档似乎不再在线,但是1.0的文档是

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.