Python爬取m3u8格式的视频

这篇具有很好参考价值的文章主要介绍了Python爬取m3u8格式的视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!

背景

在某一天,群友分享了一些小视频,手机端可以正常观看,但是到了电脑上,输入网址之后会下载下来一个m3u8格式的文件,这就让我犯了难。所以我就研究了一下,并使用Python来将该文件爬取了下来。
参考文章如下:
西北乱跑娃 — python m3u8库
Python 手把手实现M3U8视频抓取
python实战案例:解析m3u8视频文件
python爬取m3u8视频教程

1.文件信息

链接图如下
Python爬取m3u8格式的视频
下载下来呢,也是m3u8文件,一种非常特殊的文件。我们点击查看,就可以查看到
3u8的一些信息
我在这里屏蔽了网址,免得暴露我在下载什么hhhhh

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://h09.t*********wc.com/20220703/9K***sCCV/30**0kb/hls/key.key"
#EXTINF:1.16,
https://h09.*********.com/20220703/9K***V/300**b/hls/Foszl**SV.ts
#EXTINF:1.2,
https://h09.**********.com/20220703/9KR**CV/30**kb/hls/b7tCBoOu.ts

经过查阅资料,该文件的我信息大致如下

# EXTM3U:.m3u8文件的格式定义
# EXT-X-KEY: 密钥的信息
# METHOD: 加密的方法,这里采用的是AES-128的加密方式
# URI: 密钥的地址,需要获取访问得到密钥的信息
# IV: 偏移量,AES加密的方法,通过这个密钥就可以解密,获取正确的视频信息

那什么是m3u8呢?

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live
Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

通俗点可以理解为,一个视频文件拆分为多个.ts片段的视频文件,然后将所有的ts合成MP4文件就可以播放了。但是为什么有些在线或者m3u8的播放器会用不了呢?由于大部门的m3u8生成的结果不太一致,与该播放器的解密格式不一样,所以导致打开。

一般来说,在m3u8文件中都会有key以及AES的偏移量IV,我们根据其中的URL来获取他们,之后我们根据m3u8文件中的.ts的文件URL来下载视频片段,解密之后拼接成mp4的文件就行了。

2.构造请求获得m3u8文件

我们已经有了m3u8文件的URL,因此免去了抓包这一项工作。我们直接构造response即可

def get_file(url,count):
    resp=requests.request('GET',url)
    # print(resp.content)
    with open('./m3u8_link/'+str(count)+'.m3u8','wb') as f:
        f.write(resp.content)

3.获得m3u8文件中的key以及偏移量IV

根据我们上一步获得的文件内容,这里我选择使用正则来匹配出来key以及IV对应的URL,之后在构造resp即可获得其内容。
这里要说明一下,我们的m3u8文件中AES加密的时候是没有使用IV的,所以使用时实际上令IV=Key
.*?,经典的正则在爬虫中的使用了。

def get_key(path):
    with open(path, 'rb') as f:
        file_content=str(f.read())
    print(file_content)
    key_link = re.search('URI=\"(.*?)\"', file_content).group(1)
    key=requests.request('GET',key_link).content
    return key

4.获取.ts文件链接

其实这一步也可以使用正则来继续匹配,但是我偷了一点小懒,使用了m3u8库来进行匹配。

import m3u8
def get_ts_list(path):
    m3u8_obj = m3u8.load(path)
    ts_urls = []
    for i, seg in enumerate(m3u8_obj.segments):
        # if i<=100:
            ts_urls.append(seg.uri)
    # print(ts_urls)
    return ts_urls

经过这一步之后,我们就获得了m3u8文件中整个.ts文件对应的URL,接下来只要根据.ts文件对应的URL来获取视频片段,解密之后拼接就可以了。

5.进行解密

解密的库 pip install pycryptodome
就是一些常规的AES解密操作了,我们获得的m3u8文件中没有IV偏移量,这里用使iv=key即可。注意,AES要补0的,补字节0到16的倍数。

from Crypto.Cipher import AES
sprytor = AES.new(key, AES.MODE_CBC,iv)
# 获取ts文件二进制数据
ts = requests.get(ts_url).content
# 密文长度不为16的倍数,则添加b"0"直到长度为16的倍数
# decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0"
while len(ts) % 16 != 0:
    ts += b"0"
with open(name, "ab") as file:
    file.write(sprytor.decrypt(ts))

6.下载拼接

之后下载以字节流的形式进行拼接就可以了。

def download(ts_urls,key,iv,count,path):
    name=path
    print("视频",count,"需要下载的文件长度为", len(ts_urls))
    for i in range(len(ts_urls)):
        ts_url=ts_urls[i]
        if i%10==0:
            print("视频",count,"当前下载进度:",str(i/len(ts_urls)*100)[:4],'%')
        # 如果连接末尾没有.ts手动加上
        ts_name = ts_url.split("/")[-1] + '.ts'  # ts文件名
        # 解密,new有三个参数,
        # 第一个是秘钥(key)的二进制数据,
        # 第二个使用下面这个就好
        # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV
        sprytor = AES.new(key, AES.MODE_CBC,iv)
        # 获取ts文件二进制数据
        ts = requests.get(ts_url).content
        # 密文长度不为16的倍数,则添加b"0"直到长度为16的倍数
        while len(ts) % 16 != 0:
            ts += b"0"
        # 写入mp4文件
        with open(name, "ab") as file:
            # # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0"
            file.write(sprytor.decrypt(ts))
    print(name, "下载完成")

其实还可以使用多线程优化,完整项目请见本人的github。文章来源地址https://www.toymoban.com/news/detail-412529.html

到了这里,关于Python爬取m3u8格式的视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue项目如何播放m3u8格式视频

    在node_modeols里面找到@easydarwin下的dist/compent/EasyPlayer-lib.min.js和EasyPlayer.wasm两个文件复制到pubilc目录下 引入 在components中 在模板中

    2024年02月15日
    浏览(39)
  • 原生小程序实现视频监控(m3u8格式)

    本文主要实现实时播放监控视频,基于原生微信小程序实现 1、在.wxml文件代码,视频一定要写宽高,不然可能显示不出来,以下属性介绍 src:视频地址, controls:是否显示默认播放控件(播放/暂停按钮、播放进度、时间) binderror: 视频播放出错时触发 show-center-play-btn:是

    2023年04月08日
    浏览(25)
  • video插件播放m3u8格式视频(存原生)

    这里使用原生的javascript实现m3u8格式视频播放。 使用了包括video.min.js库和HLS插件。 在上面代码中,首先引入了video.min.js库和对应的播放器样式video-js.css,还引入了videojs-contrib-hls.min.js库(引入顺序考虑优先放到页面加载之前)。 之后,创建一个video标签,并指定source的src属性为

    2024年02月13日
    浏览(38)
  • 视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

    这里需要引用的库是: from Crypto.Cipher import AES 有坑哈, python3.0 之后直接安装crypto你会发现不管怎么着都会报错。 经过查找资料找到了原因,原来是20年之后crypto已经被pycryptohome替换掉啦, 如果之前安装过crypyo 活pycrypto需要先卸载 然后再安装 pycryptohome 就可以啦 首先我们需

    2024年02月14日
    浏览(46)
  • Uniapp H5 播放m3u8、flv格式视频

    简述一下业务需求,仅仅是需要在H5页面播放m3u8格式的视频,但是Uniapp官方提供的video组件在H5端不支持m3u8格式的视频播放,所以需要使用第三方库来播放,这里我使用的是MuiPlayer,但是貌似MuiPlayer的官方文档没有过多提及UniApp的用法,由于MuiPlayer默认支持mp4格式播放,所以

    2024年04月15日
    浏览(25)
  • vue项目中使用m3u8格式播放大视频

    网站中播放大视频时经常卡顿,无法顺利播放,在查找解决方案时发现很多文章建议使用m3u8流媒体播放代替MP4播放,做了下测试,现总结记录下测试过程中遇到的问题与解决办法。 1.使用ffmpeg做视频转换 1)下载ffmpeg  FFmpeg github 2)在环境变量path中加入配置,以便在控制台使

    2024年02月09日
    浏览(41)
  • 使用ffmpeg将视频转成HLS(m3u8)格式

      HLS (HTTP Live Streaming)是苹果推出的视频流协议,HLS格式的视频包含一个m3u8文本文件,以及众多的.ts的视频片段,而m3u8文本文件的作用就是将这些ts片段索引起来。 因为HLS协议是将视频切分成很多小的ts片段,这些小片段很适合放到cdn上,有很多视频文章都使用了hls格式传

    2024年02月13日
    浏览(36)
  • 在vue中使用dplayer播放hls m3u8格式视频

    Dplayer 官方文档地址 Dplayer官方地址 虽然在vue中有vue-dplayer但却没有对hls进行很好的支持 所以建议还是使用Dplayer 在组件中引入 播放m3u8格式的视频需要框选部分 – 建议查看官方文档MSE支持 切换视频 切换视频需要用到 switchVideo() api 方便大家复制 部分片段

    2024年02月13日
    浏览(26)
  • vue使用video.js实现播放m3u8格式的视频

    我使用的video.js版本如下: 在components下新建一个VideoPlayer文件夹 index如下:  直接把地址传给sourceUrl即可

    2024年02月12日
    浏览(32)
  • 【vue】前端页面点击按钮弹窗播放m3u8格式视频

    最终效果: 1.表格操作列 2.initVideo方法 3.弹出层代码 4.showAll_dialog样式 5.第2步跳转的video.html页面代码,用dplayer播放的,放在项目根目录的public文件夹即可

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包