gpt4 book ai didi

python-3.x - 有没有办法在异步中使用 youtube-dl

转载 作者:行者123 更新时间:2023-12-01 01:47:44 25 4
gpt4 key购买 nike

我有一个使用 zmq 的应用程序与 asyncio与有能力下载视频的客户沟通 youtube-dl到服务器。我尝试添加 awaityoutube_dl的下载功能,但它给了我一个错误,因为它不是协程。我现在的代码看起来像这样:

import asyncio
import youtube_dl


async def networking_stuff():
download = True
while True:
if download:
print("Received a request for download")
await youtube_to_mp3("https://www.youtube.com/watch?v=u9WgtlgGAgs")
download = False
print("Working..")
await asyncio.sleep(2)


async def youtube_to_mp3(url):
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}]
}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])


loop = asyncio.get_event_loop()
loop.create_task(networking_stuff())
loop.run_forever()

给出以下输出:
Received a request for download
[youtube] u9WgtlgGAgs: Downloading webpage
[youtube] u9WgtlgGAgs: Downloading video info webpage
[youtube] u9WgtlgGAgs: Extracting video information
[youtube] u9WgtlgGAgs: Downloading MPD manifest
[download] Destination: The Cardigans - My Favourite Game “Stone Version”-u9WgtlgGAgs.webm
[download] 100% of 4.20MiB in 00:03
[ffmpeg] Destination: The Cardigans - My Favourite Game “Stone Version”-u9WgtlgGAgs.mp3
Deleting original file The Cardigans - My Favourite Game “Stone Version”-u9WgtlgGAgs.webm (pass -k to keep)
Working..
Working..
....
Working..
Working..

而我希望 Working..要在 youtube-dl 之间打印的消息的消息也是如此。我是否在这里遗漏了什么,或者这对 async 来说是不可能的?/ await ?是 ffmpeg阻塞?如果是这样,我可以在 async 中运行下载吗?不转换为 mp3还是使用线程的唯一方法?

最佳答案

你是对的,你不能简单地使任何函数异步。

您的问题假设 youtube-dl 需要 ffmpeg 才能工作。这并不完全正确,它可以通过自己的方式下载单个流,AFAIK ffmpeg 仅用于将这些流(视频 + 音频 + 可能是字幕)混合到一个文件中。

如果您使用 ffmpeg,从性能的角度来看没有什么可取之处,因为如果它是通过子进程(最有可能的情况)使用的,那么至少会产生 1 个完整的进程来完成这项工作。与子进程的交互也可以以非阻塞方式完成——参见 https://docs.python.org/3/library/asyncio-subprocess.html ,但无论如何,如果您的代码为每个任务生成一个进程,则在任何一种情况下都无法很好地扩展。

否则,可能(并且有一定意义) fork youtube-dl 并进行更改,以便所有网络操作都基于 asyncio。这可能是相当多的重构,但它应该是可行的。

关于您的代码:
一、函数youtube_to_mp3根本不是异步的,因为没有可以执行 await … 的代码路径表达。如果删除 async,则代码的含义根本不会改变。函数定义中的单词和await来自 await youtube_to_mp3("… .

其次,即使它是异步的,您也不会以允许“并行”执行的方式使用它。 await关键字的真正含义是:控制流在这个任务中只有在等待的协程完成后才会继续。如果您需要“并行”运行多个协程,则无需直接逐个等待它们。有几种方法可以并行运行协程,例如您可以使用 https://docs.python.org/3/library/asyncio-task.html#asyncio.gather并等待生成的“组合”协程,如果所有任务都在同一时刻已知(但它看起来不像你的情况),或者使用即发即弃的方法(loop.create_task)。

关于python-3.x - 有没有办法在异步中使用 youtube-dl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47418880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com