轩_雨

青山不厌三杯酒,长日惟消一局棋
王道论坛_PC端播放和下载视频

写在最前:互联网并非法外之地,爬虫仅供技术交流(王道论坛已经在显眼的地方声明课程严禁任何形式的录制、传播和分享,所以下载自己观看就是了,不要用于盈利用途)

目标

  • 在PC端播放和下载王道论坛H5应用的视频

本篇文章的主要目的是为了分享PC端播放以及下载王道计算机考研课程的方法,用于大家通过PC端进行学习。主要是遇到一些公众号通过这些扒来的视频课件资源骗关注,我实在看不下去才写了这篇博客,希望大家不要被赚信息差价。再次提醒,请不要用于盈利用途,想获取课程可以通过购买正版图书兑换。

以“秒懂百科”为例介绍一下HLS(M3U8)格式

关于HLS(HTTP Live Streaming)网上的介绍还是很多的,这里贴一下百度百科

因为之前看其他的一些博客的时候,很多人会把M3U8解释成一种视频格式。其实M3U8只是个普通的文本文件而已,这种格式准确来说是HLS。一份标准的HLS视频应该是包含两个部分的,一部分是索引(也就是M3U8文件),一部分是存储视频数据的文件(TS文件)。

接下来以秒懂百科为例介绍一下HLS的实际表现形式。

HLS可能有两级索引或者一级索引。一般来讲,视频是有分辨率的区别的,所以在两级索引中,第一级索引常用于区分不同的分辨率,第二级索引常用于索引同一分辨率的视频切片。当用户选择分辨率之后,系统根据第一级索引选择该分辨率对应的第二级索引,然后根据第二级索引的视频顺序播放视频。

一、“秒懂百科”的视频文件

这是“秒懂百科”的部分文件,只有1KB左右大小的是索引文件(这不是区分依据,主要还是看文件实质内容),超过100KB的是视频切片文件。

image-20210611165615254

1、一级索引内容

#EXTM3U
#EXT-X-VERSION:3

#EXT-X-STREAM-INF:BANDWIDTH=1716000,RESOLUTION=720x1280
2d3ea97f16ad1d6fb558a51066b39469_720x1280_1716000.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=836000,RESOLUTION=480x852
2d3ea97f16ad1d6fb558a51066b39469_480x852_836000.m3u8

#EXT-X-ENDLIST

2、二级索引内容

  1. 2d3ea97f16ad1d6fb558a51066b39469_720x1280_1716000.m3u8

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:13
    #EXTINF:12.500000,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.0.ts
    #EXTINF:8.333333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.1.ts
    #EXTINF:12.500000,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.2.ts
    #EXTINF:8.333333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.3.ts
    #EXTINF:8.333333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.4.ts
    #EXTINF:1.733333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.0.5.ts
    #EXT-X-ENDLIST
    
  2. 2d3ea97f16ad1d6fb558a51066b39469_480x852_836000.m3u8

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:13
    #EXTINF:12.500000,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.0.ts
    #EXTINF:8.333333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.1.ts
    #EXTINF:12.500000,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.2.ts
    #EXTINF:8.333333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.3.ts
    #EXTINF:8.333333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.4.ts
    #EXTINF:1.733333,
    2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.5.ts
    #EXT-X-ENDLIST
    

3、视频切片内容

  1. 2d3ea97f16ad1d6fb558a51066b39469.m3u8.1.0.ts

    TS文件也是一种常见的视频数据文件,可以用video标签进行播放。苹果的QuickTime Player和其他主流播放器也都可以对他进行播放。

二、“秒懂百科”的视频下载及合并

1、视频链接的查找

播放视频,可以在控制台的network观察到相关文件,通过过滤就可以选取m3u8或者m3u文件。

“秒懂百科”——端午节的链接是这样的:https://baikevideo.cdn.bcebos.com/media/mda-OgBFtPA8lgXMtZ6Q/2d3ea97f16ad1d6fb558a51066b39469.m3u8

2、视频下载及合并

  1. python

    import requests, re
    from tqdm import tqdm
    
    baseUrl = "https://baikevideo.cdn.bcebos.com/media/mda-OgBFtPA8lgXMtZ6Q/"
    res = requests.get(baseUrl+"2d3ea97f16ad1d6fb558a51066b39469.m3u8")
    
    # 解析一级索引
    resStr = res.text
    matchRes = re.findall(r"#EXT-X-STREAM-INF:BANDWIDTH=([^,]*),RESOLUTION=([^x]*)x([^\n]*)\n([^\n]*)\n", resStr, re.DOTALL)
    indexRes = []
    for m in matchRes:
        indexRes.append({
            'BANDWIDTH': int(m[0]),
            'HEIGHT': int(m[1]),
            'WIDTH': int(m[2]),
            'FileName': m[3],
        })
    
    for index in indexRes:
        res = requests.get(baseUrl+index['FileName'])
        # print(res.text)
        # 解析二级索引
        resStr = res.text
        matchRes = re.findall(r"#EXTINF:([^,]*),\n([^\n]*)\n", resStr, re.DOTALL)
        videoRes = []
        print("正在下载并合成"+index['FileName'])
        pbar = tqdm(total=len(matchRes), initial=0, unit_scale=True)
        for m in matchRes:
            videoRes.append({
                'TIME': float(m[0]),
                'FileName': m[1],
            })
            res = requests.get(baseUrl+m[1])
            with open(index['FileName']+".ts", "ab") as f:
                f.write(res.content)
            pbar.update(1)
    

    这里并不能通过简单的读写文件进行文件类型转化。因为之前也看到有人的博客写可以通过读写文件将TS合成MP4文件,这其实是不对的,实际上播放器在播放的时候还是把合成的文件当成TS文件,那些依靠后缀名来识别文件的播放则无法对合成的文件进行正确解码播放。

    TS文件的压缩编码方法我没有仔细了解过,但MP4文件的压缩效率肯定是比TS高的。

  2. ffmpeg

    ffmpeg -i https://baikevideo.cdn.bcebos.com/media/mda-OgBFtPA8lgXMtZ6Q/2d3ea97f16ad1d6fb558a51066b39469_720x1280_1716000.m3u8 2d3ea97f16ad1d6fb558a51066b39469.mp4
    

    使用ffmpeg可以更简洁一些,通过m3u8文件就可以下载。不过转MP4需要花点时间,如果不想转可以把后缀名改成ts。

前面介绍这两种方法实质也是在比较下载视频压缩与否的优劣。

如果要考虑磁盘空间,则可以把下载的视频转码成MP4文件,但是编码需要花费较多的时间;

如果要考虑下载效率,则可以把下载的视频直接合成,就是占用空间大一点。

以《数据结构》为例进行视频下载

然后回到这篇博客的主题,在PC端播放和下载王道的视频。

一、在PC端播放王道的视频

因为王道PC端播放视频会出现播放不了的情况,所以特意开一小节记录这个问题。

1、通过微信的浏览器进行播放

2、通过Safari浏览器进行播放

有时不想在电脑上登陆微信,就可以通过这样播放视频。

  1. 输入链接

  2. 扫描二维码登陆

  3. 这个时候播放视频会很卡,甚至无法播放,需要切成响应式设计模式,可以正常播放。

二、在PC端下载王道的视频

王道的视频只有一级索引,所以直接拿一级索引的链接就好。

通过控制台可以得到基本的链接是这样的:https://encrypt-k-vod.xet.tech/9764a7a5vodtransgzp1252524126/0eb31fd45285890816204856468/drm/voddrm.token.YWY2YzdiMDAzNjhlZjY5Y04xdVRod0dRa3B4N3FPMnl0NjgwZXVFV1JYSTdlUTZtNmQ0ZzJTUWdXZmFtRGR0NQ.v.f421220.m3u8

另外还在URL参数带上了时间戳的16进制表示和用户标识等信息:t=60c7132f&exper=0&us=XXXX&sign=XXXXXXXX

因为带上了这些信息,字符串中出现了&。我们需要在撰写shell脚本的时候加上单引号。

ffmpeg -i 'https://encrypt-k-vod.xet.tech/9764a7a5vodtransgzp1252524126/54892dc95285890816205535660/drm/voddrm.token.MzI0ZTRkMGE3ZTNjZDRlMFN0aVpLN2hQTjVocU1HYW5tRno1aHRqQSs2cFNtSnpJanBxdUJuLzQyV2IydjQ2SA.v.f421220.m3u8?t=60c717e5&exper=0&us=XXX&sign=XXXXXX' out.mp4

如果需要批量下载的话,可以分析一下课程主页的list什么的。

最后评价一下王道的课吧。王道课程质量一般,应付考研这样子而已。真的想要好好学习计算机相关知识,看看黑皮书什么的比这种课强多了。当然啦,当成考研复习大纲来看是没什么问题的。

posted on 2021-06-13 17:18  轩_雨  阅读(2300)  评论(0编辑  收藏  举报