Python 如何在Tkinter中播放视频文件?
有没有办法播放视频文件,比如,等等 我试过使用,但显然它只适用于Python 如何在Tkinter中播放视频文件?,python,video,tkinter,Python,Video,Tkinter,有没有办法播放视频文件,比如,等等 我试过使用,但显然它只适用于 我的问题的解决方案是什么?您可以使用python gstreamer播放视频(这在Linux上适用,但在Windows上也应该适用)。这需要并且,我建议您使用这个多功能安装程序 代码如下: import os import sys import Tkinter as tkinter import gobject import gst def on_sync_message(bus, message, window_id):
我的问题的解决方案是什么?您可以使用
python gstreamer
播放视频(这在Linux上适用,但在Windows上也应该适用)。这需要并且,我建议您使用这个多功能安装程序
代码如下:
import os
import sys
import Tkinter as tkinter
import gobject
import gst
def on_sync_message(bus, message, window_id):
if not message.structure is None:
if message.structure.get_name() == 'prepare-xwindow-id':
image_sink = message.src
image_sink.set_property('force-aspect-ratio', True)
image_sink.set_xwindow_id(window_id)
gobject.threads_init()
window = tkinter.Tk()
window.geometry('500x400')
video = tkinter.Frame(window, bg='#000000')
video.pack(side=tkinter.BOTTOM,anchor=tkinter.S,expand=tkinter.YES,fill=tkinter.BOTH)
window_id = video.winfo_id()
player = gst.element_factory_make('playbin2', 'player')
player.set_property('video-sink', None)
player.set_property('uri', 'file://%s' % (os.path.abspath(sys.argv[1])))
player.set_state(gst.STATE_PLAYING)
bus = player.get_bus()
bus.add_signal_watch()
bus.enable_sync_message_emission()
bus.connect('sync-message::element', on_sync_message, window_id)
window.mainloop()
以下代码适用于我在Ubuntu 16.04下使用GStreamer 1.0和Python 3的情况。它还可以在一个窗口中将八个视频播放器堆叠在一列中。(声道只是简单地混合在一起。) libav/ffmpeg分叉在Ubuntu 14.04下产生了一些问题,这些问题似乎在16.04下得到了解决。注意,除了gstreamer1.0-plugins-*,您还需要gstreamer1.0-libav包 该代码基于@koehlma 2011年的答案,该答案假设为gstreamer0.10和python2
import sys
import os
if sys.version_info[0] < 3:
import Tkinter as tkinter
else:
import tkinter
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject
# Needed for set_window_handle():
gi.require_version('GstVideo', '1.0')
from gi.repository import 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)
NUMBER_OF_FRAMES = 8 # with more frames than arguments, videos are repeated
relative_height = 1 / float(NUMBER_OF_FRAMES)
# Only argument number checked, not validity.
number_of_file_names_given = len(sys.argv) - 1
if number_of_file_names_given < 1:
print('Give at least one video file name.')
sys.exit()
if number_of_file_names_given < NUMBER_OF_FRAMES:
print('Up to', NUMBER_OF_FRAMES, 'video file names can be given.')
file_names = list()
for index in range(number_of_file_names_given):
file_names.append(sys.argv[index + 1])
window = tkinter.Tk()
window.title("Multiple videos in a column using Tk and GST 1.0")
window.geometry('480x960')
Gst.init(None)
GObject.threads_init()
for number in range(NUMBER_OF_FRAMES):
display_frame = tkinter.Frame(window, bg='')
relative_y = number * relative_height
display_frame.place(relx = 0, rely = relative_y,
anchor = tkinter.NW, relwidth = 1, relheight = relative_height)
frame_id = display_frame.winfo_id()
player = Gst.ElementFactory.make('playbin', None)
fullname = os.path.abspath(file_names[number % len(file_names)])
player.set_property('uri', 'file://%s' % fullname)
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.mainloop()
导入系统
导入操作系统
如果系统版本信息[0]<3:
将Tkinter作为Tkinter导入
其他:
进口tkinter
导入gi
gi.require_版本('Gst','1.0')
从gi.repository导入Gst,GObject
#设置窗口句柄()需要:
gi.require_版本('GstVideo','1.0')
从gi.repository导入GstVideo
def设置帧句柄(总线、消息、帧id):
如果不是,则message.get_structure()为无:
if message.get_structure().get_name()=“准备窗口句柄”:
display_frame=message.src
显示框架。设置属性('force-aspect-ratio',True)
显示帧。设置窗口句柄(帧id)
帧数=8#如果帧数大于参数,则会重复视频
相对高度=1/浮动(帧数)
#只检查参数编号,不检查有效性。
文件名的数量=len(sys.argv)-1
如果给定的文件名数量小于1:
打印('至少提供一个视频文件名')
sys.exit()
如果给定的\u文件\u名称\u的数量@koehima是否可以在同一窗口上播放多个视频?我想显示视频“缩略图”。bus.connect是否需要窗口id?我已经试过了,上面的配方对我不起作用:我只是得到了一个空白的Tkinter窗口。关于如何调试这个有什么想法吗?我和erjoalgo有相同的想法。只是一个空白窗口。我无法安装gst,