1.显示视频先从显示单帧图片开始
#!/usr/bin/python
from Tkinter import *
from PIL import Image, ImageTk
def main():
t = Tk()
t.title('showVideo')
frmT = Frame(width = 769, height = 577)
frmB = Frame(width = 769, height = 30)
f = open('frame.rgb','rb')
str1 = f.read()
im = Image.fromstring('RGB',(768,576),str1)
photo = ImageTk.PhotoImage(im)
# imgInfo = PhotoImage(file = photo)
ToplImage = Label(frmT,image = photo)
ToplImage.image = photo
ToplImage.pack()
frmT.grid(row=0,column=0)
frmB.grid(row=1,column=0)
ToplImage.grid()
t.mainloop()
if __name__=='__main__':
main()
知识兔2.然后用普通插入图片然后刷新的方式实现,视屏是可以显示了,但是运行5分钟后内存就因为while True爆掉了,而且还没查出来怎么爆掉的,手动清理内存都没作用
#!/usr/bin/python
import sys
import gc
from Tkinter import *
from PIL import Image, ImageTk
from ctypes import *
from threading import Thread
import time
def show():
result = cdll.LoadLibrary("./libvideodev.so")
buff = create_string_buffer(768*576*3)
# t1 = Thread(target=video)
# t1.start()
# video()
# time.sleep(1)
len = 768*576*3
retCode = result.VideoDeviceInit()
print("VideoDeviceInit:",retCode)
retCode = result.SetVideoSource("0")
print("SetVideoSource:",retCode)
# retCode = result.CaptureParamSet(516,378,7)
retCode = result.CaptureParamSet(768,576,7)
print("CaptureParamSet:",retCode)
print("CaptureParamSet:",retCode)
retCode = result.StartCapture()
print("StartCapture:",retCode)
# retCode = result.GetFrame(buff,len)
# print("GetFrame:",retCode)
# print(buff.value)
# print(sizeof(buff))
# time.sleep(1)
# print(repr(buff.raw))
print("buffvalue")
t = Tk()
t.title('showVideo')
while True:
frmT = Frame(width = 769, height = 577)
frmB = Frame(width = 769, height = 30)
# f = open('frame.rgb','rb')
# str1 = f.read()
retCode = result.GetFrame(buff,len)
print(sizeof(buff))
# str1 = buff.raw
if (sizeof(buff)==1327104):
# im = Image.fromstring('RGB',(516,378),str1)
im = Image.fromstring('RGB',(768,576),buff.raw)
photo = ImageTk.PhotoImage(im)
# imgInfo = PhotoImage(file = photo)
ToplImage = Label(frmT,image = photo)
ToplImage.image = photo
# ToplImage.pack()
frmT.grid(row=0,column=0)
frmB.grid(row=1,column=0)
ToplImage.grid()
print(sys.getrefcount(ToplImage))
print(sys.getrefcount(photo))
print(sys.getrefcount(im))
print(sys.getrefcount(frmT))
print(sys.getrefcount(frmB))
print(sys.getrefcount(retCode))
del ToplImage
del(photo)
del(im)
del frmT
del frmB
del retCode
print('gc')
print(gc.collect())
print(gc.get_count())
print(time.strftime("%Y-%m-%d %H:%M:%S"))
t.update()
t.mainloop()
if __name__=='__main__':
show()
知识兔3.参考了 https://blog.csdn.net/qq_41979513/article/details/89306878 的代码 终于解决了爆内存的问题可以长期显示视屏了
#!/usr/bin/python
import sys
import gc
from Tkinter import *
from PIL import Image
from PIL import ImageTk
from ctypes import *
from threading import Thread
import time
class Extractor_GUI():
def __init__(self):
self.length = 768*576*3
self.result = cdll.LoadLibrary("./libvideodev.so")
self.buff = create_string_buffer(768*576*3)
self.__init_video()
self.__init_gui()
def __init_video(self):
retCode = self.result.VideoDeviceInit()
print("VideoDeviceInit:",retCode)
retCode = self.result.SetVideoSource("0")
print("SetVideoSource:",retCode)
# retCode = result.CaptureParamSet(516,378,7)
retCode = self.result.CaptureParamSet(768,576,7)
print("CaptureParamSet:",retCode)
retCode = self.result.StartCapture()
print("StartCapture:",retCode)
def __init_gui(self):
self.window = Tk()
self.window.title('showVideo')
self.canv = Canvas(self.window, width = 769, height = 577)
self.frmB = Frame(width = 769, height = 30)
self.canv.grid(row=0,column=0)
self.frmB.grid(row=1,column=0)
self.__action_read_frame()
def __action_read_frame(self):
while True:
retCode = self.result.GetFrame(self.buff,self.length)
print(sizeof(self.buff))
if (sizeof(self.buff)==1327104):
# im = Image.fromstring('RGB',(516,378),str1)
im = Image.fromstring('RGB',(768,576),self.buff.raw)
photo = ImageTk.PhotoImage(im)
self.canv.create_image(0,0,anchor=NW,image=photo)
self.window.update_idletasks()
# self.window.update()
def launch(self):
self.window.mainloop()
if __name__ == '__main__':
ext = Extractor_GUI()
ext.launch()
知识兔