基于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

相关文章

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文