如何在另一个方法仍在运行时调用一个方法-Python

罗尼

我正在开发一个 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
马克

问题有两个:

  1. 您实际上并未暂停音频播放,因此MediaPlayer将继续播放其余部分。根据MediaPlayer文档,它有一个函数pause(),甚至stop(). 从您的 pause_vid 方法调用它。
  2. 您需要vid.pause_vid()从另一个线程调用该方法,因为 play_vid() 方法将一直运行直到完成。您可以创建一个后台线程来播放视频。这里有一些很好的例子https://pymotw.com/3/threading/ 再想一想,MediaPlayer.play()由于文档中的措辞,我认为该方法已经在后台运行:

玩。@return: 0 如果播放开始(并且已经开始),或者 -1 错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python - 如何在运行时屏蔽一个类在 unittest 中执行

Python如何从另一个方法内部调用一个方法

如何在同一个类中的另一个 api 中调用 python api 方法?

Python如何在另一个类方法中使用一个类

python/flask:如何在调用另一个函数时运行一个函数

从Python的另一个类内部调用方法

python,从另一个类调用方法

如何在一个python程序中调用另一个python脚本?

从Python 2.7中的另一个类方法调用一个类方法

当另一个命令已经在 python-telegram-bot 中运行时,有什么方法可以运行命令吗?

如何从另一个 python 文件中的一个 python 文件中的类调用方法

如何在方法中设置条件并在python中的另一个方法中调用其输出?

Python从一个类继承,但重写调用另一个类的方法?

Python单元测试如何测试调用另一个方法的方法

如何在Python中从另一个函数调用一个函数中的一个函数?

Python3如何从另一个类中的一个类调用方法

Python-如何从另一个新修改的python文件中调用类方法

如何在python中的另一个文件中调用类的方法[单元测试]

如何在python中使用另一个实例的方法更改一个实例的属性

如何从另一个具有主函数的python模块调用单个方法

如何从Python中的另一个文件调用类方法?

在Python的同一类中从另一个方法调用一个方法

在python的同一类中的另一个方法中调用一个类的方法

如何在运行时使用C#声明一个委托并在运行时调用其方法?

如何在主线程仍在运行时使用线程运行另一个 JFrame

如何在另一个python文件中的方法中使用变量的值?

如何在python中的不同类中使用另一个类方法值?

在另一个方法内部调用带有大量参数的方法的Python方法

如何从另一个Python文件调用一个Python文件?