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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 【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文件的功能

相关文章
|
25天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
64 2
|
1月前
|
缓存 Java 索引
[Python]知识点
本文主要介绍了Python的一些高级知识点和使用细节,包括pip的使用、内置函数、列表、元组、字典、集合、变量、Lambda表达式、面向对象编程、异常处理、模块及标准库等。文章适合有一定Python基础的读者,重点在于深入理解和掌握Python的高级特性。文中还提供了大量示例代码,帮助读者更好地理解和应用这些知识点。
31 1
[Python]知识点
|
16天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
21天前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
38 3
|
22天前
|
数据采集 JSON 数据格式
深入解析:使用Python爬取Bilibili视频
本文介绍了如何使用Python编写脚本自动化下载Bilibili视频。通过requests等库获取视频和音频URL,使用ffmpeg合并音视频文件,最终实现高效下载。注意遵守网站爬虫政策和法律法规。
156 4
|
1月前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
1月前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
32 2
|
1月前
|
JavaScript 数据安全/隐私保护 Python
python爬取m3u8实战!!
本文详细介绍了如何抓取和处理m3u8视频文件,包括从网页源代码中提取m3u8文件地址、下载m3u8文件及其对应的ts片段、处理加密的ts文件以及使用ffmpeg合并视频片段。通过多线程下载和文件路径处理,确保了高效和准确的视频抓取与合并。文中还提供了具体的Python代码示例,帮助读者理解和实现整个过程。
100 1
|
22天前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
|
2月前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。