当前位置: 首页 > news >正文

使用ffmpeg和python脚本下载网络视频m3u8(全网最全面)

网上给娃找了些好看的电影和一些有趣的短视频,如何保存下来呢?从网上找各种工具?都不方便。于是想到何不编程搞定,搞个脚本。对程序员来说这都不是事儿。且我有华为云服务器,完全可以把地址记下,后台自动下载有空再看。这里总结分享下方法给有需要的小伙伴。

前言

【转载请注明出处】本文链接:https://blog.csdn.net/yyz_1987/article/details/133783787

很多网站视频不提供下载功能,遇到好的视频素材就难以下载。现在的好多在线视频都不是mp4的格式的了,查看链接是m3u8的链接。m3u8是一种播放列表文件格式,通常用于流媒体传输。它包含一系列的.ts(Transport Stream)文件的链接,这些文件包含了视频和音频的分段数据。m3u8文件本身并不包含实际的视频数据,而是指示播放器在何处获取分段视频文件。 为了防止盗版,以及流量和带宽的滥用,ts文件格式是一种视频分段的的技术,主要是需要一个索引文件列出该视频所有的分段信息,有时长和一些ts文件名的信息。

ts文件是一种常见的视频文件格式,用于存储音频、视频和其他多媒体数据。它是MPEG-2传输流的基础,也被广泛用于流媒体传输。ts文件通常是视频流的分段文件,每个文件包含一小段视频和音频数据。 在使用m3u8和ts文件时,m3u8文件作为播放列表提供给播放器,播放器会根据m3u8文件中的链接逐个下载ts文件,并按顺序播放这些分段视频文件,从而实现流媒体的播放。

ffmpeg介绍

ffmpeg是一个十分强大的音视频处理工具,提供转码、播放等基础功能,功能十分全面、强大。是一款非常好用处理音视频的软件工具包,在Win10中使用ffmpeg需要下载后再添加环境变量,下载网站:Download FFmpe

使用ffmpeg下载m3u8并转换为mp4格式:

ffmpeg -i "https://v.rnaa.xyz/hls2/cl6z9guvr000212g0w9omylow/oRrc4hpOpuO/index.m3u8?auth=4skJHep0Po6jo0ieZpY2pgc_JktDisWQ3fIRk000Gds&exp=1697072400&v=6"  -bsf:a aac_adtstoasc -c copy out.mp4 -http_persistent 0

VLC播放器介绍

可以用VLC播放器来播放m3u8的网络流视频。 

VLC是一款功能强大的开源播放器,VLC的全名为Video Lan Client,是一个开源的、跨平台的视频播放器。VLS支持多种常见音视频格式,支持多种流媒体传输协议,也可当作本地流媒体服务器使用。其官方下载地址为 https://www.videolan.org/

VLC: Official site - Free multimedia solutions for all OS! - VideoLAN

VLC功能很强大,不仅是一个视频播放器,也可以作为小型的视频服务器,一边播放一边转码,把视频流发送到网络上。

m3u8介绍

m3u8文件是指UTF8编码格式的M3U文件。m3u8文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。m3u是包含媒体文件URL的一个事实上的播放列表标准,这种格式被用来作为HTTPLive媒体流索引文件的格式。

M3U8这种文件格式本质上不是音视频文件,而是一种音视频文件的列表文件,本身文件很小,采用的是用Latin1字符集编码,是纯文本文件。它并不能在脱机模式下读取网络资源音频。设计的初衷也是为了播放音频文件。而后来采用了UTF8编码就形成了M3U8格式文件,把一个大视频文件分割成若干小文件,通过M3U8记录保存音频,视频分块的列表地址。

我们只需在浏览器下载列表中选中需要合并转码的M3U8文件,简单操作即可将其转换成常见的MP4格式。

MP4格式,曾经是互联网上在线视频运用最广泛的一种格式,但是随着移动互联网用户日益增多,MP4文件格式的弊端也日益凸显,比如文件容量大需要加载很长时间才能播放,甚至有的播放器必须完全下载完毕才能播放。

反观M3U8格式,将视频文件切分成小片并建立索引文件,用户根据自己的网络带宽,可以选择适合自己码率的文件进行播放,从而保证了视频的流畅。虽然在网络播放过程中,M3U8格式比MP4格式更具优势。

其他网络短视频下载神器

浏览器的Video DownloadHelper插件:

https://download.csdn.net/download/u014519384/74704686

Chrome浏览器媒体网站的视频下载帮助插件,下载该插件压缩包,解压得到该插件.Crx文件,复制chrome://extensions/粘贴到Chrome浏览器地址栏,打开扩展程序界面,然后直接拖动解压得到的.Crx文件到浏览器打开的扩展程序窗口内,按提示,即可完成本插件安装。

如何找m3u8视频的文件地址?

1。搜索你的电影并打开正在播放的页面

2。打开“开发者工具” ,浏览器一般快捷键是:F12 。 如果没有反应,就找设置菜单的工具里找,什么?你浏览器没有? 那你换个正常点的浏览器吧。 我反正用谷歌、傲游、还有win10 自带的Microsoft Edge都是有的!

3。找到网络(Network)一栏,在搜索过渡栏里输入m3u8 。记得,这里要按 F5把页面重新打开刷新一次,因为刚开始打开时没开工具栏,所以看不到之前下载的信息。

如图:

注意上图中的 index.m3u8 , 不一定所有网站都是这名字,只要看后辍是m3u8就可以了,如果是有多个,就点最下面那一个。 在上面点右键 》 复制 》复制链接地址。 然后把复制的地址先存起来。 也可以放到本机上的VLC播放器里播放网络流试试。

其他短视频下载方式

如果是如头条或抖音的短视频,如何查看地址:

选择过滤类型media,然后复制下面的链接地址在浏览器里打开试试。

查看到类似如下内容,可以单独复制到浏览器中播放查看。

https://v26-web.toutiaovod.com/bf217da9d3d1faef4154643e118cff90/65276756/video/tos/cn/tos-cn-ve-4/o8BjgCDn6GbA2AZA1l2eArcRDl8n7RAHSCBCeg/?a=24&ch=0&cr=0&dr=0&er=0&lr=unwatermarked&net=5&cd=0%7C0%7C0%7C0&cv=1&br=440&bt=440&cs=0&ds=3&eid=21760&ft=7X_QHBWGUUmfzSdFD02D1YswHAX1tGDkdh49eFuBBR2D12nz&mime_type=video_mp4&qs=0&rc=Zzo6OTM7OTgzaTVkZDpkZkBpamRsdTM6ZmpwbjMzNDczM0BjMTY2LzEwNi4xYGFiL2EuYSNvb2otcjRnZWNgLS1kLS9zcw%3D%3D&btag=e00028000&dy_q=1697077398&l=20231012102318359BDF54C771C3838312

或者使用you-get

You-Get是一个基于 Python 3 的下载工具。使用 You-Get 可以很轻松的下载到网络上的视频、图片及音乐。

pip3 install you-get
#或者
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple you-get

如:下载一段B站Python教学视频并保存在E:\Desktop

you-get -o E:/Desktop https://www.bilibili.com/video/av36938586

 带参数下载视频:

参数:-o 文件绝对路径

参数:-O 文件重命名

参数:--format=flv 需要下载的版本号

运行命令后,you-get将开始解析头条短视频的页面并提取视频的下载链接。然后,它将自动下载视频文件到您的当前工作目录中。 请注意,you-get可能无法支持所有头条短视频的下载,因为视频网站可能会进行更改或添加反爬虫机制。如果不能下载,则要寻找其他方式了。

python脚本下载m3u8视频

python环境依赖安装

pip install m3u8
pip install pycryptodome

Python代码:

 
#这是一个下载m3u8 视频资源的脚本   无指定序号版,根据资源数组排序 非ffmpeg合并版
import os
import re
import sys
import m3u8 
import glob
import time
import requests
import concurrent.futures
from Crypto.Cipher import AES
from concurrent.futures import as_completed#请求头
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Language': 'Zh-CN, zh;q=0.9, en-gb;q=0.8, en;q=0.7'
} #判断是否为网站地址
def reurl(url):pattern = re.compile(r'^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+')m=pattern.search(url)if m is None:return Falseelse:return True#获取密钥(针对有些m3u8文件中的视频需要key去解密下载的视频)
def getKey(keystr,url):keyinfo= str(keystr)method_pos= keyinfo.find('METHOD')comma_pos = keyinfo.find(",")method = keyinfo[method_pos:comma_pos].split('=')[1]uri_pos = keyinfo.find("URI")quotation_mark_pos = keyinfo.rfind('"')key_url = keyinfo[uri_pos:quotation_mark_pos].split('"')[1]if reurl(key_url) == False:key_url = url.rsplit("/", 1)[0] + "/" + key_urlres = requests.get(key_url,headers=headers)key = res.contentprint(method)print(key.decode('utf-8','ignore'))return method, key#下载文件
#down_url:ts文件地址
#url:*.m3u8文件地址
#decrypt:是否加密
#down_path:下载地址
#key:密钥
def download(down_url,url,decrypt,down_path,key,nameid):if reurl(down_url) == False:if len(down_url.rsplit("/", 1))>1:filename = down_url.rsplit("/", 1)[1]else:filename = down_urldown_url = url.rsplit("/", 1)[0] + "/" + down_urlelse:filename = down_url.rsplit("/", 1)[1]down_ts_path = down_path+"/{0}".format(filename)if os.path.exists(down_ts_path):print('文件 '+filename+' 已经存在,跳过下载.')else: try:res = requests.get(down_url, stream=True, verify=False,headers=headers)print('正在下载资源:'+filename+'')except Exception as e:print('requests error:',e)returnif decrypt:cryptor =  AES.new(key, AES.MODE_CBC, key)with open(down_ts_path,"wb+") as file:for chunk in res.iter_content(chunk_size=1024):if chunk:if decrypt:file.write(cryptor.decrypt(chunk))else:file.write(chunk)print('文件:['+filename+']已保存到['+down_path+']目录.')#合并ts文件
#dest_file:合成文件名
#source_path:ts文件目录
#ts_list:文件列表
#delete:合成结束是否删除ts文件   
def merge_to_mp4(dest_file, source_path,ts_list, delete=False):files = glob.glob(source_path + '/*.ts')if len(files)!=len(ts_list):print("文件不完整,已取消合并!请重新执行一次脚本,完成未下载的文件。\n如果确认已下载完所有文件,请检查下载目录移除其它无关的ts文件。")returnprint('开始合并['+source_path+']目录的ts视频...')with open(dest_file, 'wb') as fw:for file in ts_list:with open(source_path+"/"+file, 'rb') as fr:fw.write(fr.read())if delete:os.remove(file)print('合并完成! 文件名:'+dest_file+'')def main():    url = "https://xxxx/hls/index.m3u8" #下载地址,通过 cmd 传入或输入print('\n')print('参数说明:脚本后面面添加 m3u8地址参数,如打开CMD(终端命令)模式输入:m3u8dl http://xxx.xxx.com/xxx.m3u8')print('\n')print('    如果m3u8地址访问不到,提示错误,多重复几次就好。前提是确认在线能观看可下载到m3u8文件。')print('    下载中途不动了或者关机,可关闭取消下载,再次打开继续下载。')print('    有些文件一次下载不到,需要多次执行下载。')print('    等所有文件下载完后自动合成一个视频,注意看提示。')print('\n')if len(sys.argv)>1:url=(sys.argv[1])else:print('亲,没有添加m3u8地址,请在下方输入:')url=input()#禁止安全谁提示信息requests.packages.urllib3.disable_warnings() print('开始分析m3u8文件资源...')#使用m3u8库获取文件信息    try:video = m3u8.load(url, timeout=20, headers=headers)except Exception as e:print('m3u8文件资源连接失败!请检查m3u8文件地址并重试.错误代码:',e)return#设置下载路径down_path="tmp"#设置是否加密标志decrypt = False#ts列表ts_list=[]#判断是否加密key=''if video.keys[0]  is not None:method,key =getKey(video.keys[0],url)decrypt = True#判断是否需要创建文件夹if not os.path.exists(down_path):os.mkdir(down_path)#把ts文件名添加到列表中for filename  in video.segments:if len(filename.uri.rsplit("/", 1))>1:ts_list.append(filename.uri.rsplit("/", 1)[1])else:ts_list.append(filename.uri)        #开启线程池with concurrent.futures.ThreadPoolExecutor() as executor:obj_list = []begin = time.time()#记录线程开始时间for i in range(len(video.segments)):obj = executor.submit(download,video.segments[i].uri,url,decrypt,down_path,key,i)obj_list.append(obj)#查看线程池是否结束for future in as_completed(obj_list):data = future.result()# print('completed result:',data)merge_to_mp4('finalvideo.mp4', down_path,ts_list)#合并ts文件times = time.time() - begin #记录线程完成时间print('总消耗时间:'+str(times)+'')if __name__ == "__main__":main()

其他资源

【音视频基础】VLC播放器 - 知乎

使用Python脚本调用ffmpeg下载ts分段视频文件_python下载ts文件-CSDN博客

https://www.cnblogs.com/bjguanmu/articles/13044378.html

使用Python脚本调用ffmpeg下载ts分段视频文件 - 知乎

VideoDownloadHelper插件安装与使用 - 知乎

曲线救国-解决FFmpeg下载m3u8视频中途卡住的问题_ffmpeg下载m3u8太慢_myth long的博客-CSDN博客

VideoDownloadhelper无限制_网络视频解析下载_MP4_支持多平台 - 知乎

使用EasyDarwin + ffmpeg 搭建流媒体服务器,实现多台智能电视同步播放宣传视频_ffmpeg推流多个视频_三棵树机务段的博客-CSDN博客

常见流媒体服务器方案对比分析 - 知乎 

相关文章:

使用ffmpeg和python脚本下载网络视频m3u8(全网最全面)

网上给娃找了些好看的电影和一些有趣的短视频,如何保存下来呢?从网上找各种工具?都不方便。于是想到何不编程搞定,搞个脚本。对程序员来说这都不是事儿。且我有华为云服务器,完全可以把地址记下,后台自动下…...

【考研408常用数据结构】C/C++实现代码汇总

文章目录 前言数组多维数组的原理、作用稀疏数组 链表单向链表的增删改查的具体实现思路约瑟夫环问题(可不学)双向链表 树二叉搜索树中序线索二叉树哈夫曼树的编码与译码红黑树B树B树 堆顺序与链式结构队列实现优先队列排序算法(重点&#xf…...

Flink学习笔记(二):Flink内存模型

文章目录 1、配置总内存2、JobManager 内存模型3、TaskManager 内存模型4、WebUI 展示内存5、Flink On YARN 模式下内存分配6、Flink On Yarn 集群消耗资源估算6.1、资源分配6.2、Flink 提交 Yarn 集群的相关命令6.3、Flink On Yarn 集群的资源计算公式 1、配置总内存 Flink J…...

信息系统项目管理师第四版学习笔记——项目绩效域

干系人绩效域 干系人绩效域涉及与干系人相关的活动和职能。在项目整个生命周期过程中,有效执行本绩效域可以实现的预期目标主要包含:①与干系人建立高效的工作关系;②干系人认同项目目标;③支持项目的干系人提高了满意度&#xf…...

PyTorch 深度学习之加载数据集Dataset and DataLoader(七)

1. Revision: Manual data feed 全部Batch:计算速度,性能有问题 1 个 :跨越鞍点 mini-Batch:均衡速度与性能 2. Terminology: Epoch, Batch-Size, Iteration DataLoader: batch_size2, sheffleTrue 3. How to define your Dataset 两种处…...

小谈设计模式(26)—中介者模式

小谈设计模式(26)—中介者模式 专栏介绍专栏地址专栏介绍 中介者模式分析角色分析抽象中介者(Mediator)具体中介者(ConcreteMediator)抽象同事类(Colleague)具体同事类(C…...

7种设计模式

1. 工厂模式 优点:封装了对象的创建过程,降低了耦合性,提供了灵活性和可扩展性。 缺点:增加了代码的复杂性,需要创建工厂类。 适用场景:当需要根据不同条件创建不同对象时,或者需要隐藏对象创建…...

el-table合计行合并

效果如下 因为合计el-table的合并方法是不生效的,所以需要修改css下手 watch: {// 应急物资的合计合并planData: {immediate: true,handler() {setTimeout(() > {const tds document.querySelectorAll(".pro_table .el-table__footer-wrapper tr>td");tds[0]…...

新手如何快速上手HTTP爬虫IP?

对于刚接触HTTP爬虫IP的新手来说,可能会感到有些困惑。但是,实际上HTTP爬虫IP并不复杂,只要掌握了基本的操作步骤,就可以轻松使用。本文将为新手们提供一个快速上手HTTP爬虫IP的入门指南,帮助您迅速了解HTTP爬虫IP的基…...

(十五)VBA常用基础知识:正则表达式的使用

vba正则表达式的说明 项目说明Pattern在这里写正则表达式,例:[\d]{2,4}IgnoreCase大小写区分,默认false:区分;true:不区分Globaltrue:全体检索;false:最小匹配Test类似p…...

vue配置@路径

第一步:安装path,如果node_module文件夹中有path就不用安装了 安装命令:npm install path --save 第二步:在vue.config.js文件(如果没有就新建)中配置 const path require("path"); function …...

Ubuntu 18.04 OpenCV3.4.5 + OpenCV3.4.5 Contrib 编译

目录 1 依赖安装 2 下载opencv3.4.5及opencv3.4.5 contrib版本 3 编译opencv3.4.5 opencv3.4.5_contrib及遇到的问题 1 依赖安装 首先安装编译工具CMake,命令安装即可: sudo apt install cmake 安装Eigen: sudo apt-get install libeigen3-…...

【网络基础】IP 子网划分(VLSM)

目录 一、 为什么要划分子网 二、如何划分子网 1、划分两个子网 2、划分多个子网 一、 为什么要划分子网 假设有一个B类IP地址172.16.0.0,B类IP的默认子网掩码是 255.255.0.0,那么该网段内IP的变化范围为 172.16.0.0 ~ 172.16.255.255,即…...

【OCR】合同上批量贴印章

一、需求 OCR算法在处理合同等文件时,会由于印章等遮挡导致文本误识别。因此在OCR预处理时,有一个很重要的步骤是“去除印章”。其中本文主要聚焦在“去除印章”任务中的数据构建步骤:“合同伪印章”的数据构建。下面直接放几张批量合成后效果…...

Stable diffusion 用DeOldify给黑白照片、视频上色

老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术,如 DeOldify,可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。. 之前介绍过基于虚拟环境的 基于DeOldify的给黑白照片、视频上色,本次介绍对于新手比较友好的在Stable diff…...

在服务器上解压.7z文件

1. 更新apt sudo apt-get update2. 安装p7zip sudo apt-get install p7zip-full3. 解压.7z文件 7za x WN18RR.7z...

【opencv】windows10下opencv4.8.0-cuda C++版本源码编译教程

【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程前言准备工具cuda/cudnncmakeopencv4.8.0opencv_contrib CMake编译VS2019编…...

软碟通制作启动盘

一、下载并安装软碟通 二、插入U盘,打开软碟通; 三、在软碟通中选择“文件”-“打开镜像文件”,选择要制作成启动盘的ISO镜像文件; 1.打开要制作的iso文件 选择对应的iso文件 四、在软碟通中选择“启动”-“写入硬盘”&#xff…...

Tomcat和HPPT协议

1.介绍 1.Java EE 规范 JavaEE(java Enterprise Edition):java企业版 JavaEE 规范是很多的java开发技术的总称。这些技术规范都是沿用自J2EE的。一共包括了13个技术规范 2.WEB概述 WEB在计算机领域中代表的是网络 像我们之前所用的WWW&…...

Acwing.4736步行者(模拟)

题目 约翰参加了一场步行比赛。 比赛为期 N 天,参赛者共 M 人(包括约翰)。 参赛者编号为 1∼M,其中约翰的编号为 P。 每个参赛者的每日步数都将被赛事方记录并公布。 每日步数最多的参赛者是当日的日冠军(可以有并…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...