国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

Python實現(xiàn)的視頻播放器功能

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 14:21:39
文檔

Python實現(xiàn)的視頻播放器功能

Python實現(xiàn)的視頻播放器功能:這篇文章主要介紹了Python實現(xiàn)的視頻播放器功能,結(jié)合完整實例形式分析了Python基于pyglet庫實現(xiàn)視頻播放功能的相關(guān)操作技巧,需要的朋友可以參考下本文實例講述了Python實現(xiàn)的視頻播放器功能。分享給大家供大家參考,具體如下:# -*- coding:utf
推薦度:
導(dǎo)讀Python實現(xiàn)的視頻播放器功能:這篇文章主要介紹了Python實現(xiàn)的視頻播放器功能,結(jié)合完整實例形式分析了Python基于pyglet庫實現(xiàn)視頻播放功能的相關(guān)操作技巧,需要的朋友可以參考下本文實例講述了Python實現(xiàn)的視頻播放器功能。分享給大家供大家參考,具體如下:# -*- coding:utf

這篇文章主要介紹了Python實現(xiàn)的視頻播放器功能,結(jié)合完整實例形式分析了Python基于pyglet庫實現(xiàn)視頻播放功能的相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了Python實現(xiàn)的視頻播放器功能。分享給大家供大家參考,具體如下:

# -*- 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()

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Python實現(xiàn)的視頻播放器功能

Python實現(xiàn)的視頻播放器功能:這篇文章主要介紹了Python實現(xiàn)的視頻播放器功能,結(jié)合完整實例形式分析了Python基于pyglet庫實現(xiàn)視頻播放功能的相關(guān)操作技巧,需要的朋友可以參考下本文實例講述了Python實現(xiàn)的視頻播放器功能。分享給大家供大家參考,具體如下:# -*- coding:utf
推薦度:
標(biāo)簽: 功能 實現(xiàn) 播放器
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 精品欧美一区二区三区 | 国产精品久久久久9999小说 | 欧美亚洲免费 | 久久国产精品免费一区二区三区 | 欧美另类图片亚洲偷 | 国产在线不卡 | 午夜视频免费观看 | 欧美视频亚洲色图 | 日本中文字幕有码 | 国产欧美一区二区三区鸳鸯浴 | 一区二区三区免费 | 欧美人与性动交a欧美精品 欧美日本一道本 | 久久久国产一区二区三区 | 久久久这里有精品999 | 亚洲欧美一区二区三区久久 | 久久精品99久久香蕉国产色戒 | 成人中文字幕一区二区三区 | 欧美色图第一页 | 热re91久久精品国产91热 | 性欧美高清 | 久久精品福利视频 | 国产成人精品一区二三区在线观看 | 国产高清一区 | 精品一区二区三区的国产在线观看 | 91麻豆免费视频 | 国产高清不卡码一区二区三区 | 国产亚洲婷婷香蕉久久精品 | 99久久精品国产综合一区 | 欧美激情一区二区三区不卡 | 无遮挡在线观看 | 免费看一级黄色毛片 | 综合精品欧美日韩国产在线 | 亚洲欧美另类在线观看 | 一道本一区二区三区 | 韩国理论三级在线观看视频 | 国产一区精品视频 | 日韩第一页在线 | 国产成人精品三级在线 | 亚洲性一区 | 免费看黄色毛片 | 欧美老肥熟 |