2016-08-04 21 views
0

Ich versuche Video-Frames (nicht aus einem Stream) mit Tkinter zu zeigen. Der nächste Schritt sind Schaltflächen, mit denen der Benutzer im Video einen Frame rückwärts oder vorwärts bewegen kann. Ich muss sagen, dass ich ziemlich neu in der Programmierung mit Python bin. Also zuerst las ich folgenden Artikel:Wie man ein Bild einer Videodatei (Bild) mit tkinter in Python zeigt

Python-Schnipsel: Konvertieren von Video in Bildern http://srand.fr/blog/python%20import%20video.html

Die Tkinter Photobild Klasse: http://effbot.org/tkinterbook/photoimage.htm

Das Problem ist, dass ich nicht das Bild mit ImageIO umgewandelt verwenden kann oder VideoFileClip, um es mit tkinter photoimage anzuzeigen. Ich erhalte den folgenden Fehler:

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

Hier ist mein einfacher Code. Ich hoffe ihr könnt mir helfen :)

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() 

anderen Code, das gleiche Problem:

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() 

Antwort

1

Das ist ein bisschen spät, aber besser spät als nie.

Hier ist ein Arbeitsbeispiel Ich fand und ändere ein wenig, das funktioniert mit '.mp4', Videos aber nicht mit '.flv', weiß nicht warum.

Hinweis:

Python 2.7 import Tkinter

Python 3 import 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() 
0

Und hier noch ein schönes Arbeitsbeispiel eines Spielers ist, dass ich mit Tkinter und einige Probe zu machen versuchte, Code mit Opencv-Modul. Dies ist nur ein Beispiel, Code auf keinen Fall zu beenden.

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()