我正在开发一个 python 程序,它从给定的 YouTube 视频 url 中提取声音并播放它。我创建了play_vid
一种播放声音的pause_vid
方法和一种暂停声音的方法。问题是,虽然声音仍在play_vid
方法内部播放并且我尝试调用该pause_vid
方法,但该调用被忽略并且该play_vid
方法继续运行。例子:
vid = Video("youtubelink")
vid.play_vid()
time.sleep(5)
# The sound keeps playing/this method call is being ignored
vid.pause_vid()
调用play_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
非常感谢标记M让我知道,我忘了补充self.player.set_pause(1)
的pause_vid
方法。他还建议我删除 while 循环,因此我time.sleep
在主程序中使用它来决定视频将播放多长时间而不是 while 循环。更新代码:
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()
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 InvalidUrl
问题有两个:
MediaPlayer
将继续播放其余部分。根据MediaPlayer文档,它有一个函数pause()
,甚至stop()
. 从您的 pause_vid 方法调用它。vid.pause_vid()
从另一个线程调用该方法,因为 play_vid() 方法将一直运行直到完成。您可以创建一个后台线程来播放视频。这里有一些很好的例子https://pymotw.com/3/threading/ 再MediaPlayer.play()
由于文档中的措辞,我认为该方法已经在后台运行:玩。@return: 0 如果播放开始(并且已经开始),或者 -1 错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句