You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中运行play_vid方法时如何调用pause_vid方法终止音频播放

问题背景

我正在开发一款可提取指定YouTube视频链接音频并播放的Python程序,自定义了play_vid方法用于播放音频、pause_vid方法用于暂停音频。

问题现象

当play_vid方法正在运行播放音频时,调用pause_vid方法会被忽略,play_vid方法会持续运行,示例代码如下:

vid = Video("youtubelink")
vid.play_vid()
time.sleep(5)
# 音频持续播放,该方法调用被忽略
vid.pause_vid()

原始完整代码

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time, os, vlc, requests
from mutagen.mp3 import MP3


class InvalidUrl(Exception):
    def __init__(self, message="Invalid video url!"):
        super().__init__(message)


class Video:
    def __init__(self, url):
        self.url = url
        self.paused = False
        self.player = ""
        self.is_valid()
        self.time_sleep = 0

    def play_vid(self):
        driver = webdriver.Chrome("C:\chromedriver.exe")
        driver.get("https://ytmp3.cc/en14/")
        element = driver.find_element_by_id("input")
        element.send_keys(self.url)
        button = driver.find_element_by_id("submit")
        button.click()
        wait = WebDriverWait(driver, 10)
        button2 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="buttons"]/a[1]')))
        button2.click()
        vid_name = driver.find_element_by_xpath('//*[@id="title"]').text
        vid_name = vid_name.replace("| ", "")
        file_name = os.path.expanduser(r"~\Downloads\{}.mp3".format(vid_name))

        while not os.path.exists(file_name):
            time.sleep(1)

        driver.close()
        self.player = vlc.MediaPlayer()
        media = vlc.Media(file_name)
        self.player.set_media(media)
        self.player.play()
        audio = MP3(file_name)
        audio_info = audio.info
        length_in_secs = int(audio_info.length)

        while self.time_sleep != length_in_secs:
            if self.paused is True:
                return

            time.sleep(1)
            self.time_sleep += 1

    def pause_vid(self):
        self.paused = True

    def is_valid(self):
        r = requests.get(self.url)

        if "Video unavailable" in r.text:
            raise InvalidUrl

当时的需求是实现调用pause_vid方法时可以终止play_vid方法运行,调研后尚未找到合适方案。


优化修复方案

经Mark M提醒,明确了两个核心优化点:

  1. pause_vid方法中遗漏了self.player.set_pause(1)调用
  2. 可以移除原来play_vid方法末尾的while循环,改为在主程序中使用time.sleep控制视频播放时长

修复后完整代码

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time, os, vlc, requests
from mutagen.mp3 import MP3


class InvalidYouTubeUrl(Exception):
    def __init__(self, message="Invalid YouTube url!"):
        super().__init__(message)


class Video:
    def __init__(self, url):
        self.url = url
        self.player = None
        self.is_valid()
        self.vid_len = None

    def play_vid(self):
        driver = webdriver.Chrome("C:\chromedriver.exe")
        driver.get("https://ytmp3.cc/en14/")
        element = driver.find_element_by_id("input")
        element.send_keys(self.url)
        button = driver.find_element_by_id("submit")
        button.click()
        wait = WebDriverWait(driver, 10)
        button2 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="buttons"]/a[1]')))
        button2.click()
        vid_name = driver.find_element_by_xpath('//*[@id="title"]').text
        vid_name = vid_name.replace("| ", "")
        file_name = os.path.expanduser(r"~\Downloads\{}.mp3".format(vid_name))

        while not os.path.exists(file_name):
            time.sleep(1)

        driver.close()
        self.player = vlc.MediaPlayer()
        media = vlc.Media(file_name)
        self.player.set_media(media)
        self.player.play()
        audio = MP3(file_name)
        audio_info = audio.info
        self.vid_len = int(audio_info.length)

    def pause_vid(self):
        self.player.set_pause(1)

    def is_valid(self):
        r = requests.get(self.url)

        if "Video unavailable" in r.text:
            raise InvalidYouTubeUrl

完整音频播放调用示例

如果需要播放完整音频,可通过视频总时长控制程序延迟时长,实现方式如下:

import pyytmp3, time

vid = pyytmp3.Video("youtubelink")
vid.play_vid()
time.sleep(vid.vid_len)

内容的提问来源于stack exchange,提问作者Roni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:36:02