Python快速实现视频播放器

本文详细介绍了如何使用Python和pyglet库快速创建一个具备音画同步、播放/暂停、进度条、音量调节功能的视频播放器,包括了关键代码片段和操作指南,适合初学者入门。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

Python快速实现视频播放器,功能有:音画同步、播放暂停、进度条、音量调节




解决方案

安装

pip install pyglet

代码

import sys
import time

import pyglet
from pyglet.window import key, mouse

filename = '1.mp4'
source = pyglet.media.load(filename)
video_format = source.video_format
width, height = video_format.width, video_format.height
title = 'Video Player'
window = pyglet.window.Window(width, height, title, resizable=True)
player = pyglet.media.Player()
player.queue(source)
player.play()


@window.event
def on_draw():
    window.clear()
    if player.source and player.source.video_format:
        player.get_texture().blit(0, 0, width=width, height=height)


@window.event
def on_resize(_width, _height):
    global width, height
    height = _width * height / width  # 按比例缩放后的高
    width = _width


def set_fullscreen():
    if window.fullscreen:
        window.set_fullscreen(False)
    else:
        window.set_fullscreen(True)


@window.event
def on_key_press(symbol, modifier):
    window.key_begin = time.perf_counter()
    if symbol == key.SPACE:
        if player.playing:
            player.pause()
        else:
            player.play()
    elif symbol == key.ESCAPE:
        sys.exit()
    elif symbol == key.ENTER:
        set_fullscreen()


@window.event
def on_key_release(symbol, modifier):
    def get_key_value():
        key_duration = time.perf_counter() - window.key_begin
        key_value = 1 if key_duration < 0.1 else int(key_duration / 0.1)
        return key_value

    if symbol == key.UP:
        player.volume = round(player.volume + 0.1 * get_key_value(), 2)
        print(player.volume)
    elif symbol == key.DOWN:
        player.volume = round(player.volume - 0.1 * get_key_value(), 2)
        if player.volume < 0:
            player.volume = 0.0
        print(player.volume)
    elif symbol == key.LEFT:
        source.seek(player.time - get_key_value())
    elif symbol == key.RIGHT:
        source.seek(player.time + get_key_value())


@window.event
def on_mouse_release(x, y, button, modifiers):
    if button == mouse.LEFT:
        window.last_mouse_release = (x, y, time.perf_counter())
    elif button == mouse.MIDDLE:
        set_fullscreen()


@window.event
def on_mouse_press(x, y, button, modifiers):
    if button == mouse.LEFT and hasattr(window, 'last_mouse_release'):
        if (x, y) == window.last_mouse_release[:-1]:
            if time.perf_counter() - window.last_mouse_release[-1] < 0.2:
                if player.playing:
                    player.pause()
                else:
                    player.play()


pyglet.app.run()

操作

  • 左键双击播放暂停
  • 中键全屏
  • 空格播放暂停
  • 上下方向键调节音量
  • ESC 退出
  • FIXME: 等比调整画面(容易有黑边)
  • FIXME: 左右方向键调节进度(容易卡顿,且长按会音画不同步)




参考文献

  1. pyglet Documentation
  2. What’s the right way to detect double-click events with python pyglet?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XerCis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值