实现一个简单的视频播放器,效果不是很好。这里不多说,直接贴代码了。

 #-*- coding:gbk -*-
import pyglet
import os
from pyglet.gl import * def draw_rec(x,y,width,height):
"""
矩形
"""
glLoadIdentity()
glPushMatrix()
glBegin(GL_LINE_LOOP)
glVertex2f(x,y)
glVertex2f(x+width,y)
glVertex2f(x+width,y+height)
glVertex2f(x,y+height)
glEnd()
glPopMatrix() class Button(pyglet.event.EventDispatcher): def __init__(self):
super(Button,self).__init__()
self.x=y=0 #按钮的位置以及大小
self.width=height=10
self.hit=False #按钮是否被鼠标点击
self._text=pyglet.text.Label('',anchor_x='center',anchor_y='center') #初始化是必要的,必须写在__init__中,不然给他赋文本值会当成全局量,最终显示的按钮的文本是最后一个赋值(即,作为私有量) def draw(self):
"""
画按钮
"""
if self.hit:
glColor3f(0.0,1.0,0.0)
draw_rec(self.x,self.y,self.width,self.height)
glColor3f(1.0,1.0,1.0)
self.draw_label()
def set_text(self,button_text):
"""
改变按钮的文本
"""
self._text.text=button_text
button_text=property(lambda self: self._text.text,set_text)
def set_size(self,x,y,width,height):
"""
改变按钮的位置和大小
"""
self.x=x
self.y=y
self.width=width
self.height=height def on_mouse_press(self,x,y,button,modifiers):
self.dispatch_event('on_press') #调度事件
self.hit=True #鼠标点击,颜色变化
def on_mouse_drag(self,x,y,dx,dy,button,modifiers):
"""
拖动
"""
self.dispatch_event('on_value_change')
def on_mouse_release(self,x,y,button,modifiers):
self.dispatch_event('on_release')
self.hit=False #释放鼠标,恢复颜色
def draw_label(self):
"""
添加标签
"""
self._text.x=self.x+self.width/2
self._text.y=self.y+self.height/2
self._text.draw()
def hit_test(self,x,y):
return (self.x<x<self.x+self.width and self.y < y < self.y+self.height) #注册事件类型
Button.register_event_type('on_press')
Button.register_event_type('on_value_change')
Button.register_event_type('on_release') class Player(pyglet.media.Player):
x=y=0
width=height=10 def load_source(self,path):
"""
载入视频资源
"""
resource_path=[path]
pyglet.resource.path=resource_path
pyglet.resource.reindex()
if path:
for root,dirname,files in os.walk(path):
for f in files:
source=pyglet.resource.media(f)
self.queue(source)
def set_locate(self,x,y):
"""
设置播放器的位置
"""
self.x=x
self.y=y
def get_and_set_video_size(self):
"""
获取视频的大小并设置播放器的长宽
"""
if self.source and self.source.video_format:
self.width=self.source.video_format.width
self.height=self.source.video_format.height
if self.source.video_format.sample_aspect>1:
self.width*=self.source.video_format.sample_aspect
else:
self.height/=self.source.video_format.sample_aspect class MyPlayer(pyglet.window.Window):
def __init__(self,caption):
super(MyPlayer,self).__init__(caption=caption,resizable=True)
self.padding=10 #默认的间距以及长宽
self.width=50
self.height=30 #下面列出要显示的列表
self.drawable=[] #显示列表 #播放器
self.player=Player()
self.player.load_source('E:\music')
self.player.set_locate(0,self.padding*2+30) #播放器显示位置
self.player.get_and_set_video_size() #得到视频的大小并设置
self.player.EOS_NEXT='next' #按顺序进行播放
self.player.push_handlers(self) #播放/暂停控制按钮
self.play_pause_control=Button()
self.play_pause_control.width=50
self.play_pause_control.height=30
self.play_pause_control.set_size(self.padding,self.padding,self.play_pause_control.width,self.play_pause_control.height) #位置以及大小
self.play_pause_control.button_text='play' #文本设置
self.play_pause_control.on_press=lambda:self.on_play_pause()
self.drawable.append(self.play_pause_control) #将这个按钮加入到显示列表中 #全屏控制按钮
self.isscreenfull=Button()
self.isscreenfull.width=50
self.isscreenfull.height=30
self.isscreenfull.set_size(self.padding*2+self.play_pause_control.width,self.padding,self.isscreenfull.width,self.isscreenfull.height)
self.isscreenfull.button_text='全屏'
self.isscreenfull.on_press=lambda: self.set_fullscreen(True)
self.drawable.append(self.isscreenfull) def on_draw(self):
self.clear()
#显示播放器
if self.player.source and self.player.source.video_format:
self.player.get_texture().blit((self.width-self.player.width)/2,self.player.y,width=self.player.width,height=self.player.height) #注意这里width=,height=不能省略,否则画面不会出现的 #画列表中所有的控制按钮
if self.drawable:
for draw_c in self.drawable:
draw_c.draw()
def on_mouse_press(self,x,y,button,modifiers):
for dc in self.drawable:
if dc.hit_test(x,y):
dc.on_mouse_press(x,y,button,modifiers)
def on_play_pause(self):
if self.player.playing:
self.player.pause()
self.play_pause_control.set_text('pause')
else:
if self.player.time > self.player.source.duration:
self.player.seek(0)
self.player.play()
self.play_pause_control.set_text('play')
def on_mouse_release(self,x,y,button,modifiers):
for dc in self.drawable:
if dc.hit_test(x,y):
dc.on_mouse_release(x,y,button,modifiers)
def on_resize(self,width,height):
super(MyPlayer,self).on_resize(width,height)
if self.player.source:
video_width,video_height=self.player.width,self.player.height display_aspect=width/float(height)
video_aspect=video_width/float(video_height) if video_aspect>display_aspect:
self.player.width=width
self.player.height=width/video_aspect
else:
self.player.height=height
self.player.width=height * video_aspect
self.player.x=(width-self.player.width)/2
self.player.y=(height-self.player.height)/2 if __name__ == "__main__":
wn=MyPlayer('my player')
wn.set_size(int(wn.player.width),int(wn.player.height)) #将窗口的大小设置的和视频一样大小
wn.set_visible(True) #可见
wn.player.play()
pyglet.app.run()

pyglet -- 视频播放器 (简单实现,效果不是太好,切换资源会卡死)(三)的更多相关文章

  1. 从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)

    前言 话不多说,这篇文章主要讲述如何从0到1搭建一款适用于Vue.js的自定义配置视频播放器.我们平时在PC端网站上观看视频时,会看到有很多丰富样式的视频播放器,而我们自己写的video标签样式却是那 ...

  2. 转:最简单的基于 DirectShow 的视频播放器

    50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...

  3. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  4. 最简单的基于DirectShow的示例:视频播放器图形界面版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  5. 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版)

    ===================================================== 最简单的基于libVLC的例子文章列表: 最简单的基于libVLC的例子:最简单的基于lib ...

  6. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  7. Chimee - 简单易用的H5视频播放器解决方案

    Chimee是由奇舞团开源的一套H5视频播放器解决方案,由奇舞团视频云前端团队结合在业务和视频编解码方向的沉淀积累倾心打造.Chimee支持MP4.M3U8.FLV等多种媒体格式,同时它也帮我们解决了 ...

  8. 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器

    FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我把自己做项目过程中实现的一个非常简单的视频播放器 ...

  9. WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现

    原文:WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放.播放.暂停.可拖动播放进度效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,5 ...

随机推荐

  1. [2019BUAA软件工程]第1次阅读作业

    [2019BUAA软件工程]第1次阅读作业 Tips Link 作业连接 [2019BUAA软件工程]第1次阅读作业 读<构建之法>的疑惑 个人开发流程(Personal Software ...

  2. mapreduce 中 map数量与文件大小的关系

    学习mapreduce过程中, map第一个阶段是从hdfs 中获取文件的并进行切片,我自己在好奇map的启动的数量和文件的大小有什么关系,进过学习得知map的数量和文件切片的数量有关系,那文件的大小 ...

  3. 微信开发-charles抓包

    在微信开发过程中有一块不能使用开发者工具进行调试,需要查看请求的返回,故使用了charles抓包工具. 环境配置 1.http://www.charlesproxy.com/getssl/ 下载cha ...

  4. BugPhobia进阶篇章:功能规格说明书

    0x01 :特别鸣谢 首先特别鸣谢<构建之法>中并没有给出固定化格式的功能规格说明书的样例,因此在此次的说明书中将尽可能用生动形象的例子展示软件交互阐释 因此受到它本身的启发,此次团队功能 ...

  5. opencv学习笔记(五)

    线性滤波 方框滤波--boxblur函数 均值滤波(邻域平均滤波)--blur函数 高斯滤波--GaussianBlur函数 中值滤波--medianBlur函数 双边滤波--bilateralFil ...

  6. [系统软件]Ubuntu 18.04中的Shutter禁用了“编辑”选项解决

    本文引用自linux公社, 原文请点击 : https://www.linuxidc.com/Linux/2018-04/151911.htm   在Ubuntu 18.04中安装了我最喜欢的截图工具 ...

  7. MyBatis自动生成Java/C#的Bean(Entity)的等价MYSQL实现函数

    这是单元测试代码:TESTTITLECASE.sql SELECT TITLECASE('ABC_DEF_hgk') as BEANNAME FROM DUAL; SELECT TITLECASE(' ...

  8. [转帖] infiniband的协议速度

  9. [日常工作]WorkStation 使用端口转发的方式使用宿主机IP地址提供服务

    1. 虚拟机内的地址如果经常变化,或者是想使用宿主机进行网络服务 但是又不想有人能够访问具体的服务器提供机器.. 可以使用宿主机转发虚拟机的端口的方式来进行处理. workstation 比较好实现 ...

  10. Bootstrap 引入文件顺序及IE兼容性js

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...