python पायथन और जीस्ट्रीमर के साथ वीडियो थंबनेल कैसे बनाएं




video gstreamer (4)

वाल में एक उदाहरण, जीएसटी्रीमर 1.0 के साथ:

var playbin = Gst.ElementFactory.make ("playbin", null);
playbin.set ("uri", "file:///path/to/file");
// some code here.
var caps = Gst.Caps.from_string("image/png");
Gst.Sample sample;
Signal.emit_by_name(playbin, "convert-sample", caps, out sample);
if(sample == null)
    return;
var sample_caps = sample.get_caps ();
if(sample_caps == null)
    return;
unowned Gst.Structure structure = sample_caps.get_structure(0);
int width = (int)structure.get_value ("width");
int height = (int)structure.get_value ("height");
var memory = sample.get_buffer().get_memory (0);
Gst.MapInfo info;
memory.map (out info, Gst.MapFlags.READ);
uint8[] data = info.data;

मैं Gstreamer और पायथन का उपयोग कर एमपीईजी -4 एवीसी वीडियो के लिए थंबनेल बनाना चाहता हूं। अनिवार्य रूप से:

  1. वीडियो फ़ाइल खोलें
  2. समय में एक निश्चित बिंदु की तलाश करें (जैसे 5 सेकेंड)
  3. उस समय फ्रेम को पकड़ो
  4. फ्रेम को डिस्क को एक .jpg फ़ाइल के रूप में सहेजें

मैं इस दूसरे समान प्रश्न को देख रहा हूं, लेकिन मैं यह नहीं समझ सकता कि उपयोगकर्ता इनपुट के बिना स्वचालित रूप से कैप्चर और फ्रेम कैप्चर कैसे करना है।

तो संक्षेप में, मैं ऊपर दिए चरणों के अनुसार कैसे जीस्ट्रीमर और पायथन के साथ एक वीडियो थंबनेल कैप्चर कर सकता हूं?


प्लेबिन 2 का उपयोग करें यूरी को मीडिया फाइल में सेट करें, वांछित समय की स्थिति की तलाश करने के लिए gst_element_seek_simple का उपयोग करें और फिर "कन्वर्ट-फ्रेम" एक्शन सिग्नल को खोलने के लिए g_signal_emit का उपयोग करें।


सड़ांध के जवाब पर विस्तार करने के लिए, यहां एक उदाहरण है:

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

यह एक पीएनजी छवि बनाता है। आप gst.Caps("video/x-raw-rgb,bpp=24,depth=24") या उस तरह से कुछ का उपयोग कर कच्चे छवि डेटा प्राप्त कर सकते हैं।

ध्यान दें कि GStreamer 1.0 (0.10 के विपरीत) में, playbin2 का नाम बदलकर playbin रखा गया है और convert-frame सिग्नल को convert-sample नाम दिया गया है।

जीएसटी्रीमर एप्लीकेशन डेवलपमेंट मैनुअल के इस अध्याय में खोज की यांत्रिकी को समझाया गया है। 0.10 playbin2 प्रलेखन अब ऑनलाइन नहीं हैं, लेकिन 1.0 के लिए दस्तावेज यहां है


यह एक पुराना सवाल है लेकिन मुझे अभी तक इसे कहीं भी दस्तावेज नहीं मिला है।
मुझे पता चला कि निम्नलिखित गेमस्टाइल पर 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)

कोड को पायथन 2 और पायथन 3 दोनों के साथ चलना चाहिए, मुझे आशा है कि यह किसी को मदद करता है।





gstreamer