pyglet -- 视频播放器 (简单实现,效果不是太好,切换资源会卡死)(三)
实现一个简单的视频播放器,效果不是很好。这里不多说,直接贴代码了。
#-*- 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 -- 视频播放器 (简单实现,效果不是太好,切换资源会卡死)(三)的更多相关文章
- 从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)
前言 话不多说,这篇文章主要讲述如何从0到1搭建一款适用于Vue.js的自定义配置视频播放器.我们平时在PC端网站上观看视频时,会看到有很多丰富样式的视频播放器,而我们自己写的video标签样式却是那 ...
- 转:最简单的基于 DirectShow 的视频播放器
50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...
- 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)
===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...
- 最简单的基于DirectShow的示例:视频播放器图形界面版
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
- 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版)
===================================================== 最简单的基于libVLC的例子文章列表: 最简单的基于libVLC的例子:最简单的基于lib ...
- 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)
===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...
- Chimee - 简单易用的H5视频播放器解决方案
Chimee是由奇舞团开源的一套H5视频播放器解决方案,由奇舞团视频云前端团队结合在业务和视频编解码方向的沉淀积累倾心打造.Chimee支持MP4.M3U8.FLV等多种媒体格式,同时它也帮我们解决了 ...
- 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器
FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我把自己做项目过程中实现的一个非常简单的视频播放器 ...
- WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现
原文:WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放.播放.暂停.可拖动播放进度效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,5 ...
随机推荐
- ELF分析 实践
分析ELF文件: 首先编写一个.c文件,并使用gcc -c xx.c -o xx.o 对其进行编译. 我在这个实践中是ELF_1.o文件. 接下来输入ls -l ELF_1.o 查看重定位文件的信息. ...
- Linux内核分析 期末总结
Linux内核分析 期末总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 ...
- 我的Android之路——底部菜单栏的实现
底部菜单栏的实现 底部菜单栏两种实现方法:ViewPager:可滑动的界面:Fragment:固定的界面. 首先,页面布局,在除去顶部toolbar之后,将主界面分为两部分,一部分为界面显示区,另一部 ...
- 软件工程_8th weeks
第八周PSP 个人时间管理 由于本周主要在做论文实验,除了学习时间外有一些零散的时间也在思考代码的书写以及论文实验的流程,但是这些零散的时间并没有在总的表记录,所以想问一下老师,像这种平时零散思考的时 ...
- reshape、shuffle、save_weights
#-*- coding: utf-8 -*- import pandas as pd from random import shuffle import matplotlib.pyplot as pl ...
- jmeter创建高级测试计划
如果应用程序使用重写地址而不是使用cookie存储信息,需要做一些额外的工作去测试程序 为了正确的响应重写地址,jmeter 需要解析 从服务器获取html 并且检索会话ID, 1 合理利用pre-p ...
- jquery html 獲取或設置
jquery提供操作html元素的屬性和內容的強大方法. DOM就是獨立于平台和語言的界面,允許程序和腳本動態訪問和改變DOM的內容,結構和樣式. 獲取內容:text(),html(),val(),a ...
- js screen
windows.screen對象包含包含對象屏幕的信息: screen.availheight;屏幕高度 screen.availwidth;屏幕寬度
- js語句
js語句就是告訴瀏覽器要做什麼: js代碼就是js語句序列: js代碼塊就是{}包括的,函數就是一個代碼塊的典型例子: js注釋:單行注釋://,多行注釋:/**/ js對大小寫敏感: js語句可以不 ...
- 认真学习Linux系统让你真的有收获
学习,最重要的是有一个认真的态度,熟话说,读书可以改变命运,以前觉得并不一定是这样,其实经历的多了才知道,事实确实如此.试想一个不会写字看书的人,他的生活该有多么无聊.读书容易,但读好书并不总是件容易 ...