Python: How can I get the video resolution from a Gst video playbin?

1.7k views Asked by At

I have the following code that works and displays a video in a window. Can someone help me and give a simple python example on how I can extract the video resolution ( width x height ) of the video file ?

I am stuck on this since several days ... and any help would be appreciated.

import os
import Tkinter as tkinter

import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstVideo', '1.0')
from gi.repository import Gst, GObject, GstVideo

def set_frame_handle(bus, message, frame_id):
    if not message.get_structure() is None:
        if message.get_structure().get_name() == 'prepare-window-handle':
            display_frame = message.src
            display_frame.set_property('force-aspect-ratio', True)
            display_frame.set_window_handle(frame_id)

window = tkinter.Tk()
window.title('')
window.geometry('400x300-30-100')

Gst.init(None)
GObject.threads_init()

display_frame = tkinter.Frame(window, bg='')
display_frame.place(relx = 0, rely = 0, anchor = tkinter.NW, relwidth = 1, relheight = 1)
frame_id = display_frame.winfo_id()
player = Gst.ElementFactory.make('playbin', None)
filepath = os.path.realpath('kbps.mp4')
filepath2 = "file:///" + filepath.replace('\\', '/').replace(':', '|')
print filepath2
player.set_property('uri', filepath2)

player.set_state(Gst.State.PLAYING)

bus = player.get_bus()
bus.enable_sync_message_emission()
bus.connect('sync-message::element', set_frame_handle, frame_id)

window.geometry('400x300+30+300')
window.update
window.mainloop()
1

There are 1 answers

3
Samer Tufail On BEST ANSWER

Once the URI is set, set your pipeline into PAUSED state. Once that has been done, you should be prerolled, and can check the current caps on the gst-video-pad. For example:

self._playBin.set_state(Gst.State.PAUSED)
self._playBin.get_state(5000000000)
videoPad=self._playBin.emit("get-video-pad", 0)
videoPadCapabilities=videoPad.get_current_caps()(success, videoWidth) = \
videoPadCapabilities.get_structure(0).get_int("width")
(success, videoHeight) = \
videoPadCapabilities.get_structure(0).get_int("height")