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提醒,明确了两个核心优化点:
pause_vid方法中遗漏了self.player.set_pause(1)调用- 可以移除原来
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
相关产品推荐
相关产品推荐

