簡體   English   中英

如何在python中使用tkinter顯示視頻文件(圖像)的幀

[英]How to show a frame of a video file (image) with tkinter in python

我正在嘗試使用tkinter顯示視頻幀(不是來自流)。 下一步是按鈕,允許用戶在視頻中向后或向前移動一幀。 我不得不說,我在使用python編程方面還是一個新手。 因此,我首先閱讀以下文章:

Python代碼段:將視頻轉換為圖像http://srand.fr/blog/python%20import%20video.html

Tkinter PhotoImage類: http ://effbot.org/tkinterbook/photoimage.htm

問題是我無法使用通過imageio或VideoFileClip轉換的圖像與tkinter photoimage一起顯示。 我收到以下錯誤:

_tkinter.TclError: image "[[  …(some numbers)…   ]]" doesn't exist

這是我的簡單代碼。 我希望你能幫幫我 :)

from moviepy.editor import VideoFileClip
from tkinter import *
import pylab

vid =VideoFileClip("example.mp4")

window = Tk()
window.title("Choose Frame")
window.geometry ("900x600")

count =20

photo = vid.get_frame(count)
label =Label(window, image = photo)
label.pack()

其他代碼,同樣的問題:

import imageio
from tkinter import *
import pylab

filename = './example.mp4'
vid = imageio.get_reader(filename,  'ffmpeg')

window = Tk()
window.title("Choose Frame")
window.geometry ("900x600")

count =20

photo = vid.get_data(count)
label =Label(window, image = photo)
label.pack()

這有點遲了,但總比沒有好。

這是我找到並修改的一個有效示例,它適用於“ .mp4”,視頻,但不適用於“ .flv”,不知道為什么。

注意:

python 2.7導入Tkinter

python 3導入tkinter

import Tkinter as tk
import threading
import imageio
from PIL import Image, ImageTk

video_name = "test_video.mp4" #This is your video file path
video = imageio.get_reader(video_name)

def stream(label):

    frame = 0
    for image in video.iter_data():
        frame += 1                                    #counter to save new frame number
        image_frame = Image.fromarray(image)          
        image_frame.save('FRAMES/frame_%d.png' % frame)      #if you need the frame you can save each frame to hd
        frame_image = ImageTk.PhotoImage(image_frame)
        label.config(image=frame_image)
        label.image = frame_image
        if frame == 40: break                         #after 40 frames stop, or remove this line for the entire video

if __name__ == "__main__":

    root = tk.Tk()
    my_label = tk.Label(root)
    my_label.pack()
    thread = threading.Thread(target=stream, args=(my_label,))
    thread.daemon = 1
    thread.start()
    root.mainloop()

這是我嘗試使用Tkinter制作的播放器的另一個很好的工作示例,以及一些使用Opencv模塊的示例代碼。 這只是一個示例想法,絕不完成代碼。

import cv2
from Tkinter import *
from PIL import Image, ImageTk
import io
import threading
import os, sys

def resize(image):
    im = image
    new_siz = siz
    im.thumbnail(new_siz, Image.ANTIALIAS)
    return im

def size(event):
    global siz
    if siz == screenWH:
        siz = (200, 200)
    else:
        siz = screenWH
        win.state('zoomed')
    print 'size is: ', siz

def view_frame_video():
    vc = cv2.VideoCapture('test_video.flv')
    if vc.isOpened():
        rval , frame = vc.read()
    else:
        rval = False

    while rval:
        rval, frame = vc.read()
        img =Image.fromarray(frame)
        img = resize(img)
        imgtk = ImageTk.PhotoImage(img)
        lbl.config(image=imgtk)
        lbl.img = imgtk
        if stop == True: 
            vc.release()
            break      #stop the loop thus stops updating the label and reading imagge frames
        cv2.waitKey(1)
    vc.release()

def stop_():
    global stop
    stop = True

def play():
    stop = False
    t = threading.Thread(target=view_frame_video)
    t.start()



win = Tk()

stop = None
screenWH = (win.winfo_screenwidth(), win.winfo_screenheight())
siz = (200, 200)

Label(text='Press Play Button').pack()
frm_ = Frame(bg='black')
frm_.pack()
lbl = Label(frm_, bg='black')
lbl.pack(expand=True)
lbl.bind('<Double-Button-1>', size)

frm = Frame()
frm.pack()
Button(text='Play', command = play).pack(side=LEFT)
Button(text='Stop', command = stop_).pack(side=LEFT)

win.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM