You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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链接的视频流。
    解决:

    1. 安装带完整ffmpeg依赖的OpenCV版本,比如执行pip install opencv-python-headless,这个版本通常包含完整的编解码器支持。
    2. 通过ffmpeg中转视频流,再传给OpenCV,示例代码:
      cap = cv2.VideoCapture(f"ffmpeg -i {url} -f rawvideo -pix_fmt bgr24 pipe:")
      
      注意:需要先在系统上安装ffmpeg。
  • 视频编码不兼容
    你选的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:45:37