如何使用yt-dlp将YouTube音视频直接上传至Azure Blob Storage(无需本地存储)
如何使用yt-dlp将YouTube音视频直接上传至Azure Blob Storage(无需本地存储)
看起来你遇到的问题是因为yt-dlp尝试向**文本模式的标准输出(stdout)**写入二进制数据,而文本模式的流只能接收字符串,因此触发了TypeError: write() argument must be str, not <class 'bytes'>错误。从你的traceback能看出你在Jupyter环境中运行代码,这里的stdout默认就是文本模式,更容易出现这个问题。
我们可以通过调整yt-dlp的配置,让它直接将视频数据写入二进制内存流(BytesIO),再上传到Azure Blob Storage,完美避开这个兼容问题。下面是修正后的代码:
import io from yt_dlp import YoutubeDL from azure.storage.blob import BlobServiceClient # 替换为你的实际配置信息 video_url = 'https://www.youtube.com/watch?v=<your_video_id>' connect_str = 'DefaultEndpointsProtocol=https;AccountName=your_account;AccountKey=your_key;EndpointSuffix=core.windows.net' container_name = 'your_container' blob_name = 'output_video.mp4' # 初始化Azure Blob客户端 blob_service_client = BlobServiceClient.from_connection_string(connect_str) blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name) # 配置yt-dlp:直接写入二进制流,避免stdout文本模式问题 ydl_opts = { 'format': 'best', 'quiet': True, 'noplaylist': True, # 确保只下载单个视频,防止意外下载播放列表 } with io.BytesIO() as byte_stream: # 将二进制流赋值给yt-dlp的stdout,让它直接把下载的数据写入流中 ydl_opts['stdout'] = byte_stream with YoutubeDL(ydl_opts) as ydl: ydl.download([video_url]) # 将流的指针重置到起始位置,准备上传 byte_stream.seek(0) # 上传流到Azure Blob Storage blob_client.upload_blob(byte_stream, overwrite=True) print(f'✅ 成功上传 {blob_name} 到Azure Blob Storage!')
关键修改说明:
- 移除了
outtmpl: '-':不再依赖标准输出(stdout)作为中转,而是直接指定yt-dlp的输出目标为我们的二进制内存流。 - 添加
ydl_opts['stdout'] = byte_stream:让yt-dlp把下载的二进制视频数据直接写入BytesIO流,彻底避免了文本模式流的类型限制。 - 增加
noplaylist: True:额外的防护措施,确保只处理单个视频,避免因视频URL包含播放列表参数导致的意外情况。
另外,如果你想保留使用outtmpl: '-'的思路,也可以通过将全局stdout切换为二进制模式来解决,但这种方法可能影响其他输出功能,不推荐在交互式环境(如Jupyter)中使用:
import sys # 临时将stdout切换为二进制模式 sys.stdout = sys.stdout.detach() # 然后运行你原来的代码(需调整流的读取逻辑) # 注意:这种方法可能导致后续print()输出异常,需要谨慎使用
备注:内容来源于stack exchange,提问作者Freejack
相关产品推荐
相关产品推荐

