python知识点100篇系列(18)-解析m3u8文件的下载视频

简介: 【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
  • 什么是m3u8:

    m3u8是苹果公司推出的视频播放标准,是m3u8的一种,只是编码格式采用的是UTF-8。

其实m3u8是一种索引文件,m3u8文件中记录了视频的网络地址;

  • 和m3u8配套的一个概念是HLS:

HLS(Http Live Streaming) 是一个由苹果公司提出的基于HTTP的流媒体网络传输协议,直接把流媒体切片成一段段ts文件,通过m3u8索引文件按序访问ts文件,客户端不停的从服务器获取文件,实现播放音视频的功能

HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。在开始一个流媒体会话时,客户端会下载一个包含元数据的 (m3u8) playlist文件,用于寻找可用的媒体流。

基于以上的概念,如果要下载相关的ts文件,首先是需要找到m3u8文件;

  • 下载m3u8文件:

m3u8文件一般可以直接在浏览器里找到,打开目标视频播放页面,按F12打开开发者模式

在这里插入图片描述
选择NetWork,在过滤框中输入m3u8过滤,皆可以找到m3u8文件;
点击链接,就能看到m3u8文件的内容;
在这里插入图片描述

可以看到有多个ts文件相关记录,这个ts是最终要下载的文件信息;

网络上部分m3u8文件中会记录ts文件的全路径地址,直接使用,下载即可;
如果是ts文件的相对路径,需求去浏览器中找到一个请求ts文件的链接,按照模块拼接成全路径即可;

  • 有了m3u8文件,下一步是解析,获取下载地址

使用Python解析m3u8文件伪代码如下:

def parseM3u8(m3u8_file):
    '''解析m3u8'''
    ts_lines = []
    with open(m3u8_file,'r') as f:
        lines = f.readlines()
        ts_lines = [line.replace('\n','') for line in lines if 'start=' in line]
    return ts_lines;

传入m3u8文件地址,只获取到ts相关的记录信息,存入列表中;

  • 获取到ts文件地址,开始下载文件

def downloadTs(lines):
    key = getKey()
    n = 0
    for args in lines:
        n = n + 1
        download_url = f'https://***4cb1544e5285890819192252940/drm/{args}&st=63811ac1&us=neOGEIULKi'

        ts_c = requests.get(url=download_url).content
        filename = f'H:/ts/{str(n).zfill(4)}.ts'
        with open(filename,'wb') as f:
            f.write(ts_c)

循环ts文件下载地址列表,下载单个文件,并有规律的命名;以便于后续合并;

  • 如果ts下载的文件无法播放,那可能是需要解密:

首先查看一下m3u8文件中是否有类似下图的文字;其中URI指向的就是加密的key;
在这里插入图片描述
如图所示,METHOD=AES-128,代码加密的方式是AES,所以解密也需要使用ASE;

  • 解密需要使用Crypto

安装Crypto:

直接安装Crypto,可能会导致找不到模块,尤其是在python3.8版本上;
所以推荐使用以下命令直接安装:

pip install pycryptodome

安装完成后,编写解密代码:


def aes_decrypt(data, key, iv):    
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad
    new_data = pad(data_to_pad=data, block_size=AES.block_size)    
    aes_d = AES.new(key, AES.MODE_CBC, iv)    
    return aes_d.decrypt(new_data)

如果运行以上代码,提示找不到模块,那需要改个文件夹名称;

**\Lib\site-packages 中找到一个文件夹叫做crypto,将c改成C,即可

  • 解密ts文件;
    在上面下载ts文件代码的最后一句后,修改如下:

    with open(filename,'wb') as f:

    f.write(aes_decrypt(ts_c,key,key))

  • 合并ts文件;
    由于文件数量多,所以首先需要将ts文件写入到txt文件中;
    然后使用ffmpeg命令合并ts文件为mp4文件;

实现的伪代码如下:

def ts2mp4():
    '''合并ts文件到mp4'''
    import os
    file_list = os.listdir('H:/ts')
    #file_list.sort(key=lambda x: int(x[0:-12])) # 文件名 按数字排序
    with open('ts1.txt','w') as f:
        f.writelines([f'file /ts/{filepath}\n' for filepath in file_list])
        f.close()
    os.system('ffmpeg -f concat -safe 0  -i ts1.txt -c copy ts1.mp4')

总结

以上代码实现了从m3u8文件中获取ts文件,下载并合并为mp4文件的功能

相关文章
|
4月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1239 0
|
3月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
|
3月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
278 0
|
4月前
|
存储 大数据 Unix
Python生成器 vs 迭代器:从内存到代码的深度解析
在Python中,处理大数据或无限序列时,迭代器与生成器可避免内存溢出。迭代器通过`__iter__`和`__next__`手动实现,控制灵活;生成器用`yield`自动实现,代码简洁、内存高效。生成器适合大文件读取、惰性计算等场景,是性能优化的关键工具。
299 2
|
4月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
1338 0
|
3月前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。
|
4月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
10月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1047 29
|
10月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
450 4
|
10月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多