使用yt_dlp作为Python库时,如何获取视频的流缓冲区数据?
yt_dlp作为Python库时,如何获取视频的流缓冲区数据?
嘿,我来帮你搞定这个问题!你遇到的AttributeError: '_io.BytesIO' object has no attribute 'replace'是因为用错了outtmpl参数——这个参数需要的是字符串格式的输出路径模板(比如'%(title)s.%(ext)s'),而不是直接传入BytesIO对象,yt_dlp内部会对这个参数执行字符串操作,所以才会抛出这个错误。
想要把视频流直接加载到内存缓冲区里,正确的思路是把输出定向到标准输出(用outtmpl: '-'),再把yt_dlp的标准输出重定向到你的BytesIO缓冲区。我给你修正后的代码:
import io import yt_dlp def download_video_to_buffer(url): # 创建存储视频数据的二进制缓冲区 buffer = io.BytesIO() ydl_opts = { 'format': 'best', 'quiet': True, 'noplaylist': True, 'outtmpl': '-', # 指定输出到标准输出(stdout) } with yt_dlp.YoutubeDL(ydl_opts) as ydl: # 把yt_dlp的标准输出重定向到我们的缓冲区 ydl.params['stdout'] = buffer # 启动下载 ydl.download([url]) # 下载完成后,将缓冲区指针移到起始位置,方便后续读取 buffer.seek(0) # 返回视频二进制数据,如果你需要bytearray,可转成bytearray(buffer.getvalue()) return buffer.getvalue() # 示例调用 video_data = download_video_to_buffer("你的目标视频URL") # 现在video_data就是视频的二进制数据,可直接用于后续处理(比如流媒体传输、转存对象存储等)
这样就能完全在内存里处理视频数据,不需要写入本地文件系统啦。另外要注意,如果是超大视频,这种方式会占用较多内存,你可以根据场景调整,比如分段处理之类的。
备注:内容来源于stack exchange,提问作者Mr_Wamsy
相关产品推荐
相关产品推荐

