likes
comments
collection
share

用python做个简单视频播放器,初识tkinter、cv2、PIL图像模块的使用

作者站长头像
站长
· 阅读数 3

今天通过用python做个简单的视频播放器,做为初步入门tkinter、cv2、PIL模块的入门练习。

一 程序要求

使用python中的tkinter窗口,制作一个视频播放软件。 用python做个简单视频播放器,初识tkinter、cv2、PIL图像模块的使用

二 播放窗口

1 导入tkinter模块

从tkinter模块中导入所有模块

from tkinter import *

2 建立窗口和标题

# 创建Tkinter窗口
root = Tk()
root.title('视频播放器')

标题即程序窗口左上角显示的文字。

3 创建播放用的标签

# 创建一个标签用来显示视频帧
label = Label(root)
label.pack()

1 Label为创建标签的函数,创建的位置为root窗口。 下图这种不可修改文字的控件就是标签

用python做个简单视频播放器,初识tkinter、cv2、PIL图像模块的使用

(本图为IDLE中设置代码字体大小的窗口)

2 pack函数的功能是将label显示在窗口上,没有这一行,label标签相当于隐藏了。

4 窗口持续显示

程序的最后一行写入

root.mainloop()

用于持续显示root窗口, 不然程序一瞬间运行完了,咱们只能看到窗口一闪而过......有时快的你甚至看到不闪过。

5 运行效果

此时,程序的运行效果是这样的

用python做个简单视频播放器,初识tkinter、cv2、PIL图像模块的使用

三 加载并播放视频

1 加载视频

# 创建视频捕捉对象
cap = cv2.VideoCapture('32.mp4'

32.mp4是视频的名称, 这个视频要和程序放在同一个文件夹下, 如果不放在一个文件夹下,就要写明详细的绝对路径,如: D:\video\32.mp4

2 建立一个播放视频的函数

自定义函数 update_frame

def update_frame():

3 读取下一帧

ret, frame = cap.read()

用read读取图像下一帧的内容,会返回两个值,分别赋值给retframe ret 的值为TrueFalse,表示有没有读取到下一帧图像。 frame 的值为图像的数据数组

4 更改颜色格式

# 将BGR颜色的OpenCV帧转换为RGB颜色
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

第3步frame的图片颜色格式为BRG,此处将其改为tkinter能够识别的RGB格式。 cv2.COLOR_BGR2RGB是一个常量,直接这么用就行

5 转换图像

# 将frame图像数据转为图像
im = Image.fromarray(frame)
# 将图像进一步转为tkinter可识别的图像
img = ImageTk.PhotoImage(image=im)

6 显示图像

# 给label自定义一个属性,避免img数据被python将垃圾回收了
label.imgtk = img
# 让label控件加载图片
label.config(image=img)

7 实现视频播放效果

# 每隔10ms更新一次帧
root.after(10, update_frame)

让本窗口在10ms后,再加载一下本函数,实现图像的加载刷新

四 Python视频播放器源代码

import cv2
from tkinter import *
from PIL import Image, ImageTk

# 更新帧的函数
def update_frame():
    ret, frame = cap.read()
    if ret:
        # 将BGR颜色的OpenCV帧转换为RGB颜色
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        # 将OpenCV图像转换为Pillow图像,然后转换为PhotoImage
        im = Image.fromarray(frame)
        img = ImageTk.PhotoImage(image=im)
        
        # 显示图像
        label.imgtk = img
        label.config(image=img)
        # 每隔10ms更新一次帧
        root.after(10, update_frame)
    else:
        # 如果视频结束,重新设置视频读取的起始位置
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
        update_frame()  # 重新开始视频播放

        # 如果视频结束,释放捕捉对象
        # 下面这行用于 播放完就停止
        # cap.release()


# 创建Tkinter窗口
root = Tk()
root.title('视频播放器')

# 创建一个标签用来显示视频帧
label = Label(root)
label.pack()

# 创建视频捕捉对象
cap = cv2.VideoCapture('32.mp4')  # 替换为你的视频文件路径

# 开始更新帧
update_frame()

# 运行应用
root.mainloop()

以下就是用python做简单的视频播放器的全部过程解析,做为初步入门tkinter、cv2、PIL模块的入门练习可试着做一下,看不太懂没关系,先自己动手做一下

本文结束

如有疑问,请直接留言!必回! 如有帮助,请点赞转发!感谢!

关注Python入门速学, 带你实战快速学Python

本文使用 markdown.com.cn 排版