Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Tkinter中播放视频文件?_Python_Video_Tkinter - Fatal编程技术网

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,