V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chuankoog
V2EX  ›  问与答

从 youtube 和 B 站 下载视频的必要性

  •  
  •   chuankoog · Oct 9, 2020 · 3346 views
    This topic created in 2028 days ago, the information mentioned may be changed or developed.

    云服务很方便, 直到我收藏的视频莫名其妙地被删掉了.

    现在都用上了 HTML5 video, 理论上只要能够下载 HTML5 video 就能从大多网站上下载视频了.

    所以直接 wget video.src 不就万事大吉了?

    实际上 B 站和 youtube 的 video 标签长这样:

    <video src="blob:https://www.youtube.com/xxx"></video>

    blob 是什么

    blob URL 是作用域仅在本页面的链接, 它是这样创建的:

      var mediaSource = new MediaSource();
      video.src = URL.createObjectURL(mediaSource);
      console.log(video.src) // blob:https://xxxxxxx
    

    这里有更好的介绍 mdn: https://developer.mozilla.org/en-US/docs/Web/API/MediaSource

    我们更关心如何下载它.

    下载 HTML5 video

    看起来劫持浏览器请求就能拿到视频数据, 但是实际执行起来, 判断识别组合, 都有难度.

    前面代码展示了 blob URL 指向了 mediaSource object. 实际上就是 mediaSource 内包含了视频的数据, appendBuffer() 方法向 mediaSource 内 feed 数据, 我们是否可以劫持这个方法拿数据?

    可行! 为此我还写了一篇博客和相应的包:

    https://www.tiaoxingyubolang.com/zh/article/2020-10-09_mediasource

    https://github.com/derekchuank/videox

    Supplement 1  ·  Oct 9, 2020
    我不用特定的软件 /浏览器插件去下载视频, 是因为起初是希望建一个网站提供下载服务, 就像那些 youtube get 一样.

    直到我想了想我那传家宝小鸡的配置, 便打消了建站的念头.

    但是建站用这个 idea 是绝对可行的. 那些浏览器插件也是可行的. 别人的具体实现就没看过了.
    13 replies    2020-10-09 10:25:46 +08:00
    kookpua
        1
    kookpua  
       Oct 9, 2020 via iPhone
    b 站的客户端不是可以下载视频么
    ipadpro4k
        2
    ipadpro4k  
       Oct 9, 2020 via iPhone
    拜膜大佬,写英文博客
    sutking
        3
    sutking  
       Oct 9, 2020   ❤️ 1
    @kookpua #1 B 站客户端下载的视频离开了客户端怎么办?然后,将来换了手机怎么办?再然后,下载的多了,手机空间放不下怎么办?
    iConnect
        4
    iConnect  
       Oct 9, 2020 via Android
    那些 YouTube video get 的网站,是不是也是这样下载的?

    @kookpua 客户端下载的视频,可以提取视频源文件出来吗?
    weak
        5
    weak  
       Oct 9, 2020 via Android
    IDM 解君愁
    windseeker386
        6
    windseeker386  
       Oct 9, 2020 via iPhone
    b 站 ump 版本下载神器,最高分辨率,自动转 mp4 格式,弹幕同步下载
    WayneCmd
        7
    WayneCmd  
       Oct 9, 2020
    @sutking #3 那你有考虑过版权问题么。
    monkeyWie
        8
    monkeyWie  
       Oct 9, 2020
    这种实现方式做不到断点下载吧?
    Mikewu
        9
    Mikewu  
       Oct 9, 2020 via Android
    b 站 api 获取视频源文件 cdn 地址,改下 headers 就能直接下载了
    chuankoog
        10
    chuankoog  
    OP
       Oct 9, 2020
    @monkeyWie 理论上可以做到, 可能需要对劫持到的数据进行解析加工, 需要大量代码, 对我来说不切实际.

    这个方法本质上就是劫持浏览器得到的数据而已.
    Cu635
        11
    Cu635  
       Oct 9, 2020
    @shenlanAZ
    有版权问题的,网站会通过技术手段阻止你下载通用格式的视频。
    kookpua
        12
    kookpua  
       Oct 9, 2020
    TypeError
        13
    TypeError  
       Oct 9, 2020 via Android
    我还是喜欢直接用 YouTube-dl 、youget 这些工具,功能多解析全
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3825 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 10:27 · PVG 18:27 · LAX 03:27 · JFK 06:27
    ♥ Do have faith in what you're doing.