2016-08-23 3 views
0

Я написал небольшой медиа-плеер на питоне, используя TKinter и GStreamer, встроенные в мое приложение. Игрок основан на приведенном ниже коде, который представляет собой небольшую модификацию для Way to play video files in Tkinter?, которая работает.Как изменить размер и обрезку в видеоплеере с помощью GStreamer в python TKinter?

import os, sys 
import Tkinter as tkinter 
import threading 

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

def set_frame_handle(bus, message, frame_id): 
    if not message.get_structure() is None: 
     print message.get_structure().get_name() 
     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('500x400') 

GObject.threads_init() 
Gst.init(None) 

display_frame = tkinter.Canvas(window, bg='#030') 
display_frame.pack(side=tkinter.TOP,expand=tkinter.YES,fill=tkinter.BOTH) 
frame_id = display_frame.winfo_id() 

player = Gst.ElementFactory.make('playbin', None) 

filepath = os.path.realpath('kbps.mp4') 
filepath2 = "file:///" + filepath.replace('\\', '/').replace(':', '|') 
player.set_property('uri', filepath2) 

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

player.set_state(Gst.State.PLAYING) 

window.mainloop() 

мне нужно увеличить в некоторой части видео, и поэтому мне нужно использовать GStreamer Base Plugins называется videocrop и videoscale, которые являются как часть GStreamer 1.0.

К сожалению, после нескольких дней исследований я не смог найти простой пример python о том, как эти плагины могут использоваться в TKiinter (я не использую Gtk или какую-либо другую библиотеку).

Может ли кто-нибудь предоставить мне пример того, как они могут быть использованы? Любая помощь приветствуется. Спасибо заранее ...

ответ

0

Я понял, и это можно сделать, добавив элемент видеофильтра. код для добавления состоит в следующем:

VideoCrop = Gst.ElementFactory.make('videocrop', 'VideoCrop') 
VideoCrop.set_property('top', 100) 
VideoCrop.set_property('bottom', 100) 
VideoCrop.set_property('left', 50) 
VideoCrop.set_property('right', 150) 
player.set_property('video-filter', VideoCrop) 

и ниже ид весь исходный код, испытанные как на Linux и Windows,

import os, sys 
import Tkinter as tkinter 

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

def set_frame_handle(bus, message, frame_id): 
    if not message.get_structure() is None: 
     print message.get_structure().get_name() 
     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('500x400') 

GObject.threads_init() 
Gst.init(None) 

# can aslo use display_frame = tkinter.Frame(window) 
display_frame = tkinter.Canvas(window, bg='#030') 

display_frame.pack(side=tkinter.TOP,expand=tkinter.YES,fill=tkinter.BOTH) 
frame_id = display_frame.winfo_id() 

player = Gst.ElementFactory.make('playbin', None) 

filepath = os.path.realpath('kbps.mp4') 
filepath2 = "file:///" + filepath.replace('\\', '/').replace(':', '|') 
player.set_property('uri', filepath2) 

VideoCrop = Gst.ElementFactory.make('videocrop', 'VideoCrop') 
VideoCrop.set_property('top', 100) 
VideoCrop.set_property('bottom', 100) 
VideoCrop.set_property('left', 50) 
VideoCrop.set_property('right', 150) 
player.set_property('video-filter', VideoCrop) 

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

player.set_state(Gst.State.PLAYING) 

window.mainloop() 

 Смежные вопросы

  • Нет связанных вопросов^_^