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

 #-*- 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. 实训十二(stick的设定)

    上篇我们介绍到人物主角的设定,其实人物是有工具使的,那就是——stick小棍. 信息的获取.起始位置.长度的加载.边界的判断.位置.长度重置是需要我们主要考虑的问题 信息获取上考虑的使什么时候加载st ...

  2. Visual

    #include   int main()   {   std::cout<<"Hello World !"<<std::endl;   char resp ...

  3. ubuntu——caffe配置deeplab

    1. 下载deeplab 2. 安装matio sudo apt-get install libmatio-dev 3. 修改Makefile文件 LIBRARIES += glog gflags p ...

  4. eclipse webproject activiti

    https://stackoverflow.com/questions/42858723/activiti-eclipse-maven-project-to-dynamic-web-project-a ...

  5. A glance for agile method

    看看Apache最新的JIRA,新版的JIRA是有Agile模块的. Scrum早有耳闻,接触得也比较多,Kanban一次面试中提到过.今日深入查阅KanBan: http://www.agilewe ...

  6. C++ 动态内存分配(6种情况,好几个例子)

    1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对 ...

  7. PSP(5.11——5.17)以及周记录

    1.PSP 5.11 14:30 20:00 130 200 Cordova A Y min 5.12 9:00 14:00 100 200 Cordova A Y min 5.13 13:30 15 ...

  8. 热修改 MySQL 数据库 pt-online-schema-change 的使用详解

    由于周五公司团建的关系所以此篇推迟了抱歉. 首先不得不在该篇里面梳理一个数据库热增加删除字段表的工具 pt-online-schema-change 这个工具在前面我的博文 <关于utf8mb4 ...

  9. python自动化运维笔记1 —— 系统性能信息模块psutil

    一.系统基础信息模块 1.1 系统性能信息模块psutil psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率( ...

  10. spring cloud实战与思考(五) JWT之携带敏感信息

    需求: 需要将一些敏感信息保存在JWT中,以便提高业务处理效率. 众所周知JWT协议RFC7519使用Base64Url对Header和Payload的Json字符串进行编解码.A JWT is re ...