基于m3u8流媒体格式的视频下载软件编写(一)m3u文件的提取

2023-10-21 08:30

本文主要是介绍基于m3u8流媒体格式的视频下载软件编写(一)m3u文件的提取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于m3u8流媒体格式的视频下载软件编写(一)m3u8文件的提取

写在前面:
  本内容仅作为个人学习python语言、pyqt软件和makedown笔记的记录笔记使用,由于笔者水平较差,由此程序带来的一切问题本人概不负责,文章版权属于笔者个人,转载注明即可

前言

  在日常生活使用中可以从互联网上获得大量的影视资源,但是当处于网络通讯不够通畅的环境时往往希望提前将影视资源进行下载以方便日后的观看,由于笔者在学习python的过程中产生了下载视频的需求,以此为契机,进行了部分研究,作为笔者学习python语言的练习小项目。目前关于html+jsp+css的知识储备不足。在以后的论述中,如果有值得改进的部分,希望读者能指出,笔者也能进一步提升自己的能力。

零.开发环境

  计算机系统:windows 10
  python版本:3.9.0
  编译环境:vscode+Python(插件)+Pylance(插件)
  pyqt版本:待定(还没到这一步)

一.m3u8流媒体格式简述

  m3u8是多数视频网站使用的流媒体格式,主要以文件列表的形式存在,既支持直播又支持点播。它是一种UTF-8编码格式的M3U文件,用于记录索引的纯文本文件。打开M3U8文件时,播放软件并不是直接播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。[1]视频网站将视频片段切分为很短的.ts文件,根据m3u8文件进行播放。因此从视频网站上下载视频需要下完成对m3u8文件的下载。
  使用诸如potplayer的播放器可以直接播放m3u8格式的视频,但是需要从网络上下载,并且要切换视频,使用起来不如直接在网页上观看,因此不推荐直接观看该格式视频。

二.m3u8文件的获取

2.1 浏览器检查功能直接提取

  以chrome为例按下F12或者鼠标在页面空白处右键——>检查——>Network(如图1所示),浏览器右侧会进入如图2所示数据包页面。图2中画圈的m3u8文件下载下来,长的那个就是存.ts视频链接的m3u8文件。直接下载下来即可。
图1

图1.右键检查

图2

图2.Chrome检查面板

2.2 基于urllib库对m3u8文件进行下载

  如果要进行批量下载,显然人工进行下载就不太适合了,经过我在互联网上初步的搜索,目前没有特别直观的自动化处理方法,所以笔者还是使用python来进行处理。使用urllib获取网页信息,beautifulsoup解析urllib的数据,re进行正则替换来获得最终的网址

import urllib.request  # 获取网页数据#
import urllib.parse
import re  # 正则
from bs4 import BeautifulSoup  # 解析网址
2.2.1 m3u8索引下载

  根据笔者目前使用的两个视频网站,如图2所示有两个m3u8文件,但只有一个是真正的.ts视频片段索引文件,另一个存的是这个真正索引文件的部分链接,就是第三行那个。以后将存有.ts文件链接的m3u8文件称为.ts视频索引,而储存m3u8文件链接的称为m3u8索引。

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=1080x608
1000k/hls/index.m3u8

  虽然这些视频网站的源码里也、不会直接出现.ts视频索引的链接,但是会出现m3u8索引的链接(笔者对该网页的链接进行了部分屏蔽处理):

<script>var zanpiancms_player = {"player":"\/public\/","url":"https:\/\/**********\/index.m3u8","next":"http:\/\/www.*******.com\/***********\/1-2.html","name":"1080zyk","apiurl":null,"adtime":"0","adurl":"\/loading.html","copyright":0,"danmu":{"status":0}};</script>

就是这个index.m3u8,将文件打开,就有了.ts视频索引的部分地址,将m3u8索引的连接中的index.m3u8替换为1000k/hls/index.m3u8就可以下载.ts视频索引了

REquest = '视频播放页的网页链接(http://.....com)'  #网页链接
try:response = urllib.request.urlopen(REquest)     #urllib获取网页源码REsponse = response.read().decode('utf-8')     #以utf-8格式解析
except urllib.error.URLError:print("time out")                              #错误处理
bs = BeautifulSoup(REsponse, "html.parser")        #用beautifulsoup分析网页
result = bs.find_all('script')                     #找到<script>段
result_str = str(result)                           #转str
m3u8_Complie = re.compile("https.*m3u8")           #建立正则替换规则获取m3u8索引链接
m3u8_add0 = re.findall(m3u8_Complie, result_str)   #正则提取(https:\/\/*******\/index.m3u8)
m3u8_add_Complie = re.compile(r"\\")               #建立删除'\\'的正则替换规则
m3u8_add = m3u8_add_Complie.sub("", m3u8_add0[0])  #删除'\\'
try:                                               #下载m3u8索引urllib.request.urlretrieve(m3u8_add, 'downaddress.m3u8')
finally:print('downaddress.m3u8_done')

  先使用urllib获取到网页信息,再用beautifulsoup库对网页信息进行解析,使用正则对beautifulsoup解析出的数据进行提取和修改来获得m3u8索引的下载链接。这部分学习了B站up主IT私塾的《Python课程天花板,Python入门+Python爬虫+Python数据分析5天项目实操/Python基础.Python教程》17-23内容[2],re库的部分参考了知乎Wayne的《内行必看!Python Re 模块超全解读!》[3]

  然后再使用 urllib.request.urlretrieve() 下载该文件

f = open('downaddress.m3u8', encoding='utf-8')    #打开m3u8索引
index = f.readlines()                             #按行读取内容
url_tail_Complie = re.compile(".*m3u8")           #提取.ts视频所以规则
for url in index:                                 #正则提取尾部链接URL_tail = re.findall(url_tail_Complie, url)URL = re.sub("index.m3u8", URL_tail[0], m3u8_add) #.ts视频索引提取
try:                                              #下载.ts视频索引urllib.request.urlretrieve(URL, 'index.m3u8')
finally:print('index.m3u8_done')

  在获得了m3u8索引以后,正则提取.ts视频索引的尾部链接,并拼接成对应的下载链接然后下载。至此完成了对m3u8文件的自动化下载,不再需要手动下载了。

最后推荐一个笔者用起来很方便的正则表达式在线测试工具[4]

参考文献

[1]https://baijiahao.baidu.com/s?id=1771477818317416305&wfr=spider&for=pc
[2]https://www.bilibili.com/video/BV12E411A7ZQ/?p=20&vd_source=6bb230b3262b4647b393176cec65c7c5
[3]https://zhuanlan.zhihu.com/p/68014839
[4]https://c.runoob.com/front-end/854/

这篇关于基于m3u8流媒体格式的视频下载软件编写(一)m3u文件的提取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/253175

相关文章

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖