使用OpenCV Python读取YouTube视频失败问题排查
问题:OpenCV无法读取YouTube-dl获取的360p MP4直链
我用youtube-dl获取YouTube视频的直链,筛选出360p的MP4格式链接后传入OpenCV的VideoCapture函数,但cap.read()返回False,无法读取视频。相关代码和输出如下:
def videoUrl(vidurl): with youtube_dl.YoutubeDL(dict(forceurl=True)) as ydl: r = ydl.extract_info(vidurl, download=False) urlList = list(filter(lambda item: item['ext'] == 'mp4' and item['format_note']=='360p', r['formats'])) url = urlList[0]['url'] return url url = videoUrl('https://youtu.be/Zv11L-ZfrSg') print(url) cap=cv2.VideoCapture(url) succ, frame = cap.read() print(succ)
输出:
https://rr5---sn-ci5gup-cags.googlevideo.com/videoplayback?expire=1663552781&ei=rXgnY7OMAr6J_9EPvo-J6A8&ip=35.245.37.143&id=o-AMOfn5poZclrb4XygNf_fVdBLN7bYM1oFyyHT6qq9baI&itag=396&aitags=133,134,135,136,137,160,242,243,244,247,248,271,278,313,394,395,396,397,398,399,400,401,571&source=youtube&requiressl=yes&vprv=1&mime=video/mp4&ns=hmKzaLHbydm6DqqwqJSpk-wI&gir=yes&clen=35032048&dur=987.133&lmt=1648295005031855&keepalive=yes&fexp=24001373,24007246&c=WEB&rbqsm=fr&txp=4531432&n=KHMl7qz6AZjwBQ42&sparams=expire,ei,ip,id,aitags,source,requiressl,vprv,mime,ns,gir,clen,dur,lmt&sig=AOq0QJ8wRQIgS83pxuiS_nTQwm1bQqPMmqARiL__pBsCLCkHk-VGn8wCIQCieZlzAgoAs3oVjL-_LME_LQO-5UkIm5bdIO4mLdeutg%3D%3D&redirect_counter=1&rm=sn-p5qe7s7z&req_id=11d038818408a3ee&cms_redirect=yes&cmsv=e&ipbypass=yes&mh=O0&mip=2401:4900:33b9:d505:bbc1:9bb3:783d:f56&mm=31&mn=sn-ci5gup-cags&ms=au&mt=1663530663&mv=u&mvi=5&pl=48&lsparams=ipbypass,mh,mip,mm,mn,ms,mv,mvi,pl&lsig=AG3C_xAwRQIgbJY67vqv8sjjUhvyzPwEEgMgfjPLopTPzj5Ec6TaI1ICIQCzceH2B8P-8XfZvIeKxDAhXNrmwrQXdiJHy5mV-jn2yA%3D%3D False
可能的原因及解决办法
YouTube直链的时效性限制
你拿到的googlevideo链接是临时授权的,带expire参数(你的链接里是expire=1663552781),过了这个时间点就失效。而且这类链接绑定了请求时的IP,换IP或者隔段时间就用不了。
解决:每次读取视频前重新获取直链,确保链接是最新的。OpenCV对HTTPS流的支持不足
OpenCV底层依赖的ffmpeg如果没启用HTTPS支持,就没法加载HTTPS链接的视频流。
解决:- 安装带完整ffmpeg依赖的OpenCV版本,比如执行
pip install opencv-python-headless,这个版本通常包含完整的编解码器支持。 - 通过ffmpeg中转视频流,再传给OpenCV,示例代码:
注意:需要先在系统上安装ffmpeg。cap = cv2.VideoCapture(f"ffmpeg -i {url} -f rawvideo -pix_fmt bgr24 pipe:")
- 安装带完整ffmpeg依赖的OpenCV版本,比如执行
视频编码不兼容
你选的itag=396是VP9编码的纯视频流,部分OpenCV版本对VP9的支持不够好。换成H.264编码(avc1)的360p MP4格式就能解决,对应itag=134。修改你的筛选逻辑:urlList = list(filter(lambda item: item['ext'] == 'mp4' and item['format_note']=='360p' and item['vcodec'] == 'avc1', r['formats']))缺失请求头被拒绝访问
YouTube的直链可能需要特定的User-Agent等请求头才能正常访问,OpenCV的VideoCapture默认不会携带这些头,导致请求被拒绝。
解决:用ffmpeg命令加上请求头再传给OpenCV,示例:cap = cv2.VideoCapture(f'ffmpeg -user_agent "Mozilla/5.0" -i "{url}" -f rawvideo -pix_fmt bgr24 pipe:0')
内容的提问来源于stack exchange,提问作者theunreal
相关产品推荐
相关产品推荐

