问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助: python 的 视频播放器 能运行的源码 不求多大多少功能

发布网友 发布时间:2022-04-18 13:52

我来回答

3个回答

懂视网 时间:2022-04-18 18:13

这篇文章主要介绍了Python实现的视频播放器功能,结合完整实例形式分析了Python基于pyglet库实现视频播放功能的相关操作技巧,需要的朋友可以参考下

本文实例讲述了Python实现的视频播放器功能。分享给大家供大家参考,具体如下:

# -*- coding:utf-8 -*-
#! python3
# ----------------------------------------------------------------------------
# pyglet
# Copyright (c) 2006-2008 Alex Holkner
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions 
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright 
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# * Neither the name of pyglet nor the names of its
# contributors may be used to endorse or promote products
# derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# ----------------------------------------------------------------------------
'''Audio and video player with simple GUI controls.
'''
__docformat__ = 'restructuredtext'
__version__ = '$Id: $'
import sys
from pyglet.gl import *
import pyglet
from pyglet.window import key
def draw_rect(x, y, width, height):
 glBegin(GL_LINE_LOOP)
 glVertex2f(x, y)
 glVertex2f(x + width, y)
 glVertex2f(x + width, y + height)
 glVertex2f(x, y + height)
 glEnd()
class Control(pyglet.event.EventDispatcher):
 x = y = 0
 width = height = 10
 def __init__(self, parent):
 super(Control, self).__init__()
 self.parent = parent
 def hit_test(self, x, y):#点中控件
 return (self.x < x < self.x + self.width and 
 self.y < y < self.y + self.height)
 def capture_events(self):
 self.parent.push_handlers(self)
 def release_events(self):
 self.parent.remove_handlers(self)
class Button(Control):
 charged = False
 def draw(self):
 if self.charged:
 glColor3f(0, 1, 0)
 draw_rect(self.x, self.y, self.width, self.height)
 glColor3f(1, 1, 1)
 self.draw_label()
 def on_mouse_press(self, x, y, button, modifiers):
 self.capture_events()
 self.charged = True
 def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
 self.charged = self.hit_test(x, y)
 def on_mouse_release(self, x, y, button, modifiers):
 self.release_events()
 if self.hit_test(x, y):
 self.dispatch_event('on_press')
 self.charged = False
Button.register_event_type('on_press')#注册事件
class TextButton(Button):
 def __init__(self, *args, **kwargs):
 super(TextButton, self).__init__(*args, **kwargs)
 self._text = pyglet.text.Label('', anchor_x='center', anchor_y='center')
 def draw_label(self):
 self._text.x = self.x + self.width / 2
 self._text.y = self.y + self.height / 2
 self._text.draw()
 def set_text(self, text):
 self._text.text = text
 text = property(lambda self: self._text.text,
  set_text)
class Slider(Control):
 THUMB_WIDTH = 6
 THUMB_HEIGHT = 10
 GROOVE_HEIGHT = 2
 def draw(self):
 center_y = self.y + self.height / 2
 draw_rect(self.x, center_y - self.GROOVE_HEIGHT / 2, 
  self.width, self.GROOVE_HEIGHT)
 pos = self.x + self.value * self.width / (self.max - self.min)
 draw_rect(pos - self.THUMB_WIDTH / 2, center_y - self.THUMB_HEIGHT / 2, 
  self.THUMB_WIDTH, self.THUMB_HEIGHT)
 def coordinate_to_value(self, x):#改变进度
 return float(x - self.x) / self.width * (self.max - self.min) + self.min
 def on_mouse_press(self, x, y, button, modifiers):
 value = self.coordinate_to_value(x)
 self.capture_events()
 self.dispatch_event('on_begin_scroll')
 self.dispatch_event('on_change', value)
 def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
 value = min(max(self.coordinate_to_value(x), self.min), self.max)
 self.dispatch_event('on_change', value)
 def on_mouse_release(self, x, y, button, modifiers):
 self.release_events()
 self.dispatch_event('on_end_scroll')
Slider.register_event_type('on_begin_scroll')
Slider.register_event_type('on_end_scroll')
Slider.register_event_type('on_change')
class PlayerWindow(pyglet.window.Window):
 GUI_WIDTH = 400
 GUI_HEIGHT = 40
 GUI_PADDING = 4#按钮间隔
 GUI_BUTTON_HEIGHT = 16
 def __init__(self, player):
 super(PlayerWindow, self).__init__(caption='Media Player',
   visible=False, 
   resizable=True)
 self.player = player
 self.player.push_handlers(self)
 self.player.eos_action = self.player.EOS_PAUSE
 self.slider = Slider(self)
 self.slider.x = self.GUI_PADDING#类变量
 self.slider.y = self.GUI_PADDING * 2 + self.GUI_BUTTON_HEIGHT
 self.slider.on_begin_scroll = lambda: player.pause()
 self.slider.on_end_scroll = lambda: player.play()
 self.slider.on_change = lambda value: player.seek(value)
 self.play_pause_button = TextButton(self)
 self.play_pause_button.x = self.GUI_PADDING
 self.play_pause_button.y = self.GUI_PADDING
 self.play_pause_button.height = self.GUI_BUTTON_HEIGHT
 self.play_pause_button.width = 45
 self.play_pause_button.on_press = self.on_play_pause
 win = self#自有妙用
 self.window_button = TextButton(self)
 self.window_button.x = self.play_pause_button.x + 
  self.play_pause_button.width + self.GUI_PADDING
 self.window_button.y = self.GUI_PADDING
 self.window_button.height = self.GUI_BUTTON_HEIGHT
 self.window_button.width = 90
 self.window_button.text = 'Windowed'
 self.window_button.on_press = lambda: win.set_fullscreen(False)#注意不能写self
 self.controls = [
 self.slider, 
 self.play_pause_button,
 self.window_button,
 ]
 x = self.window_button.x + self.window_button.width + self.GUI_PADDING
 i = 0
 for screen in self.display.get_screens():
 screen_button = TextButton(self)
 screen_button.x = x
 screen_button.y = self.GUI_PADDING
 screen_button.height = self.GUI_BUTTON_HEIGHT
 screen_button.width = 80
 screen_button.text = 'Screen %d' % (i + 1)
 screen_button.on_press = 
 (lambda s: lambda: win.set_fullscreen(True, screen=s))(screen)
 self.controls.append(screen_button)
 i += 1
 x += screen_button.width + self.GUI_PADDING
 def on_eos(self):
 self.gui_update_state()
 def gui_update_source(self):
 if self.player.source:
 source = self.player.source
 self.slider.min = 0.
 self.slider.max = source.duration
 self.gui_update_state()
 def gui_update_state(self):
 if self.player.playing:
 self.play_pause_button.text = 'Pause'
 else:
 self.play_pause_button.text = 'Play'
 def get_video_size(self):
 if not self.player.source or not self.player.source.video_format:
 return 0, 0
 video_format = self.player.source.video_format
 width = video_format.width
 height = video_format.height
 if video_format.sample_aspect > 1:
 width *= video_format.sample_aspect
 elif video_format.sample_aspect < 1:
 height /= video_format.sample_aspect
 return width, height
 def set_default_video_size(self):
 '''Make the window size just big enough to show the current
 video and the GUI.'''
 width = self.GUI_WIDTH
 height = self.GUI_HEIGHT
 video_width, video_height = self.get_video_size()
 width = max(width, video_width)
 height += video_height
 self.set_size(int(width), int(height))
 def on_resize(self, width, height):
 '''Position and size video image.'''
 super(PlayerWindow, self).on_resize(width, height)
 self.slider.width = width - self.GUI_PADDING * 2
 height -= self.GUI_HEIGHT
 if height <= 0:
 return
 video_width, video_height = self.get_video_size()
 if video_width == 0 or video_height == 0:
 return
 display_aspect = width / float(height)
 video_aspect = video_width / float(video_height)
 if video_aspect > display_aspect:
 self.video_width = width
 self.video_height = width / video_aspect
 else:
 self.video_height = height
 self.video_width = height * video_aspect
 self.video_x = (width - self.video_width) / 2
 self.video_y = (height - self.video_height) / 2 + self.GUI_HEIGHT
 def on_mouse_press(self, x, y, button, modifiers):
 for control in self.controls:
 if control.hit_test(x, y):
 control.on_mouse_press(x, y, button, modifiers)
 def on_key_press(self, symbol, modifiers):
 if symbol == key.SPACE:
 self.on_play_pause()
 elif symbol == key.ESCAPE:
 self.dispatch_event('on_close')
 def on_close(self):
 self.player.pause()
 self.close()
 def on_play_pause(self):
 if self.player.playing:
 self.player.pause()
 else:
 if self.player.time >= self.player.source.duration:#如果放完了
 self.player.seek(0)
 self.player.play()
 self.gui_update_state()
 def on_draw(self):
 self.clear()
 # Video
 if self.player.source and self.player.source.video_format:
 self.player.get_texture().blit(self.video_x,
   self.video_y,
   width=self.video_width,
   height=self.video_height)
 # GUI
 self.slider.value = self.player.time
 for control in self.controls:
 control.draw()
if __name__ == '__main__':
 if len(sys.argv) < 2:
 print('Usage: media_player.py <filename> [<filename> ...]')
 sys.exit(1)
 for filename in sys.argv[1:]:
 player = pyglet.media.Player()
 window = PlayerWindow(player)
 source = pyglet.media.load(filename)
 player.queue(source)
 window.gui_update_source()
 window.set_default_video_size()
 window.set_size(400,400)
 window.set_visible(True)
 window.gui_update_state()
 player.play()
 pyglet.app.run()

热心网友 时间:2022-04-18 15:21

热心网友 时间:2022-04-18 16:39

参考pygame.movie
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
父母离异的话,会不会导致孩子心智不成熟? 过节 公司给我们发的购物卡 这个怎么做分录 属于福利费吗 需要计提吗... 乡村振兴公务员和省考公务员有什么区别 ...小时候跟着爷爷学国画书法,小受家是农村的,小受姓夏或叶,他带着他... 瑞麒X1安全装置 瑞麒X1的舒适型和豪华型有什么区别?配置有哪些不同的地方?这5000块多在... 瑞麒X1的安全性能方面配置如何? 脚崴了 有大量於血 怎么样才能快速消肿 脚崴了外侧出现瘀血浮肿怎么消除? ...换了我喜欢的发型,但是穿了件有点透明的衣服,可以看到肩_百度... 怎么才能让头发不卷不硬? 我的头发发质不硬,怎么解决 水系离子电池概念股有哪些 被封16天怎么办? 被封16天,怎么办 南京人民中学的进来回答一哈子~~~ 谁能解释一下~~ 这句话是什么意思? 请问哈子有什么好看的动漫? 梦见和老公女子儿子一起到水里耍里,我逮哈一条大鱼? 马上10.1来了,今年想跟家人一起出去耍一盘,就在成都周边的郊县,有哪些不错的景点啊? 三天时间去峨眉山玩 求攻略 都是清朝君主信任的人,清朝重臣有谁? 俄语发音‘’牙.哈湫阿逮哈弃‘’是什么意思拜托各位了 3Q 爸爸这话是什么意思? 张家界逮哈子商贸有限公司怎么样? 论述魏晋玄学及发展阶段 我想问哈四川的方言、 揪到是哈子意思 应该是逮到、 他们说是蹲到 问哈 、、、 哈子什么意思 关于 玄学与魏晋南北朝文化 逮哈子这首歌怎样跟建党100周年连起 干河蚌肉怎么泡发不硬 男的,17岁,头发多密,不硬不软,请问怎么吹头发吹蓬松啊?然后用发泥又怎么胶蓬松啊? 有几个人投诉封号 校园访客系统有抓拍的功能吗?可以上传实时视频的那种? 零钱通提现到银行卡要多久? 零钱通转到农行卡一万多要多长时间到帐? 想入一款触摸屏显示器,看中优派的TD2740,请问这款好不好? 前任比现任有钱,我心里不平衡 该认命么?前男友比现任有钱,有房有车,而现任呢,什么都没有,跟他注定是劳碌命,我要怎么办?好不甘心 有钱的前男友,没钱的现男友,我该选哪个? 能不能让男友知道我的前任比他有钱? 现任没有前任有钱 前任是个有钱人,现任是个穷光蛋 前任可以给你钱和不多的爱情 现任可以给你全部的爱你难过他陪你 因为喝多了跟现男友说了很多关于前男友的事情说前男友比你有钱多了什么话,该怎么办? 前女友变得很有钱我很自卑怎么办? 分手2年了,前女友看她现任比我有点钱就天天欺负我,说我是个穷屌丝,各种看不起我。我受不了了。 现任不如前任有钱很丢脸吗 前任很会赚钱,找的现任不会赚钱又抠门,心里不平衡怎么办? 交往的男友,都说他前任漂亮有钱,舍得给他花钱,我就郁闷了,这么好的事情,他怎么可能放手 金钱和前任选哪一个,女士回答?