60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
import gi
|
|
import sys
|
|
|
|
gi.require_version('Gst', '1.0')
|
|
from gi.repository import Gst, GLib
|
|
|
|
def play_kiosk_video():
|
|
Gst.init(None)
|
|
|
|
VIDEO_PATH = "file:///root/python/vid.mp4"
|
|
|
|
SINK_STR = (
|
|
"videoconvert ! "
|
|
"video/x-raw,format=BGRx ! "
|
|
"kmssink driver-name=mxsfb-drm connector-id=37 plane-id=31 can-scale=false" )
|
|
|
|
# Create the playbin element
|
|
pipeline = Gst.ElementFactory.make("playbin", "player")
|
|
pipeline.set_property("uri", VIDEO_PATH)
|
|
|
|
# Set the custom video sink
|
|
video_sink = Gst.parse_bin_from_description(SINK_STR, True)
|
|
pipeline.set_property("video-sink", video_sink)
|
|
|
|
# Set audio to fakesink (prevents errors if no audio hardware is found)
|
|
audio_sink = Gst.ElementFactory.make("fakesink", "audio-fake")
|
|
pipeline.set_property("audio-sink", audio_sink)
|
|
|
|
# --- LOOPING LOGIC ---
|
|
bus = pipeline.get_bus()
|
|
bus.add_signal_watch()
|
|
|
|
def on_message(bus, msg):
|
|
t = msg.type
|
|
if t == Gst.MessageType.EOS:
|
|
print("End of video. Looping...")
|
|
pipeline.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, 0)
|
|
elif t == Gst.MessageType.ERROR:
|
|
err, debug = msg.parse_error()
|
|
print(f"Error: {err}")
|
|
loop.quit()
|
|
return True
|
|
|
|
bus.connect("message", on_message)
|
|
|
|
# Start playback
|
|
print(f"Starting playback: {VIDEO_PATH}")
|
|
pipeline.set_state(Gst.State.PLAYING)
|
|
|
|
loop = GLib.MainLoop()
|
|
try:
|
|
loop.run()
|
|
except KeyboardInterrupt:
|
|
print("\nStopping player...")
|
|
finally:
|
|
pipeline.set_state(Gst.State.NULL)
|
|
|
|
if __name__ == "__main__":
|
|
play_kiosk_video()
|