m3u8
被禁⽌下载的钉钉直播回放如何下载?
简介
m3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。
M3U8是一种文件格式,通常用于指定多媒体播放列表。 它是一种文本文件,其中包含了媒体资源的URL地址,用于指导播放器在特定顺序和时间间隔内加载和播放这些资源。
原理
将完整的视频拆分成多个 .ts 视频碎片,.m3u8 文件详细记录每个视频片段的地址。视频播放时,会先读取 .m3u8 文件,再逐个下载播放 .ts 视频片段。
常用于直播业务,也常用该方法规避视频窃取的风险。加大视频窃取难度。
总结起来,M3U8是一种用于指定流媒体播放列表的文件格式,常用于HLS流媒体传输协议中。
需要注意的一点是:M3U8文件是一种文本文件,可以使用文本编辑器创建和编辑。
视频播放的过程
现在的视频网站采用的是流媒体传输协议,就是将一段视频切成无数个小段,这几个小段就是ts格式的视频文件,一段一段的网站上播放。
这样做的好处是观看更加流畅,因为他会根据网络状况自动切换视频的清晰度,在网络状况不稳定的情况下,对保障流畅播放非常有帮助。
我们可以了解下,一个视频播放的全过程。
1.服务器采集编码传输视频到切片器 2.切片器对视频创建索引文件,并且切割成n个ts文件 3.这2个文件传输到http服务器上 4.网站/客户端根据索引文件查找http服务器上的ts文件,连续播放这n个ts文件,就可以了。
image.png所以我们可以知道,索引文件非常重要,索引文件里面存储着ts文件的网络url链接,网站需要拿到索引文件,去按照url链接下载在http服务器中的ts文件,类似于爬虫。
拿到了ts文件之后,本身这些ts文件就是原视频中的一小段视频,所有ts文件下载顺序播放,就完成了整个视频的播放。
而索引文件就是m3u8文件。
现在大部分视频网站传输都是采用这种方法,所以,也就是说,如果你在观看网页视频的时候,能够弄到加载该视频的m3u8文件,那么再配合一些工具,就能下载该视频了。
如何拿到视频的m3u8文件呢?
猫抓插件
一个chrome插件,是一个非常有名的嗅探插件。
image.png
我们看网页版bilibili
而网页版优酷则使用猫抓嗅探不到任何东西,可是打开network,可以手动拿到.m3u8的链接。
我把该链接复制出来,url,可以拿到是一个m3u8的文件。
m3u8如何下载?
拿到了含有.m3u8的链接后,如何下载下来视频呢?
网上有很多提取工具
-
在线提取工具:http://blog.luckly-mjw.cn/tool-show/m3u8-downloader/index.html
-
N_m3u8DL-CLI-SimpleG 一个.exe后缀的window系统的软件
软件使用也很简单,打开N_m3u8DL-CLI-SimpleG.exe文件,首先设置视频下载之后的位置,其次把m3u8地址复制进去,选择下方的合并后删除分片,最后点击go就可以了。
image.png点击go之后,会出现命令行窗口,等待下载就可以了
- 夸克
但是这些都是针对没有任何版权的视频下载的。
现在的各大视频网站全部都做了加密,比如虎课,一个设计学习的收费网站,m3u8文件中使用了AES-128加密,是对每个切片进行了加棉。这个加密方式目前我还没有解密出来。
不过我要下载的是钉钉的直播回放,这个群内回放虽然设置了不允许下载,但是我通过它的m3u8文件,发现每一个切片可以单独下载下来,并且可以我试验了 5个切片可以合并成一个短视频,并且可以正确播放,于是思路来了:把所有切片下载下来,然后使用TS助手合并就好了。
各大视频网站用的啥
- 爱奇艺是.f4v,也有mp4
- 腾讯视频,播放电视剧之前的广告都是一段一段的.mp4
- B站是.m4s
- 钉钉是m3u8
- 虎课是m3u8 AES-128 加密的
-
优酷 .m3u8
image.png
ffmpeg命令
爬取完视频发现都是一系列的ts文件。而且都是几百KB的视频片段,.ts 全名叫:MPEG Transport Stream,它是一个万能的多媒体容器,可以装下音频、视频、字幕。有时我们需要将.ts文件转换为其他更加广泛被支持的格式,比如mp4格式,这样就可以在各种设备上播放和分享。
通常各种ts合成工具都是使用到ffmpeg命令进行合成的,下面我来介绍下直接使用ffmpeg命令进行合成。
- 下载ffmpeg:
brew install ffmpeg
- 单个文件转换格式:
ffmpeg -i yourfilename.ts output.mp4
- 少量多个文件合成一个视频文件
直接写文件名,文件之间使用 | 隔开
ffmpeg -i "concat:1.ts|2.ts|3.ts|4.ts|.5.ts|" -c copy output.mp4
- 大量多个文件合成一个视频文件
需要将多个.ts文件名路径保存再一个txt文档中,而且格式必须一致,不能有中文,比如:file.txt文件,格式如下:file '文件路径'
4.1 新建file.txt文档:
file '/Users/hehe/Downloads/1702548298_1223480927_1.ts'
file '/Users/hehe/Downloads/1702548298_1517382547_2.ts'
file '/Users/hehe/Downloads/1702548298_150341039_3.ts'
注意:这里必须是单引号,双引号会报错。
4.2 执行FFmpeg命令
# -safe 0: 防止Operation not permitted
ffmpeg -f concat -safe 0 -i file.txt -c copy out.mp4
有时使用上面的命令会出现如下错误: alformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)
原因:
音频数据是AAC流,在解码时需要ADTS(Audio Data Transport Stream)头部,不管是容器封装还是流媒体,没有这个,一般都是不能播放的。
改为输入下面的命令即可解决:
ffmpeg -f concat -safe 0 -i file.txt -c:v copy -c:a copy -bsf:a aac_adtstoasc output.mp4
- 拆分文件
ffmpeg -ss 00:00:00.0 -to 00:00:10.0 -accurate_seek -i origin.mp4 -c copy -avoid_negative_ts 1 seg1.mp4
备注:
ffmpeg -ss 视频开始时间 -to 视频结束时间 -accurate_seek -i 要剪切的视频名称 -c copy -avoid_negative_ts 1 剪切完成保存名称
视频播放
- 采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
概念引入
我相信音视频大家每天都会接触,从快播到爱奇艺,从B站再到抖音,我们的脚步从未停下。
image.png从上边的介绍,我们可以提取对视频的两种应用场景:
-
本地播放。先保存为文件,再使用本地播放器播放
-
在线观看。在线观看又分为 直播(直播即实时视频,只要终端接收流就从那一刻开始)和 点播(点播即编辑好的视频文件,存放在服务区或云上,被观众任意观看)
上边这两种应用场景,对于技术实现上来说有什么区别呢?
对于本地播放,每个视频都有自己的格式( .MP4,.RMVB, .AVI )等,这些格式代表的是 封装格式。简称视频格式,也称为 容器 。为了统一口径,本文统一称 视频封装格式 。何为封装格式?就是把视频数据和音频数据打包成一个文件的规范。仅仅靠看文件的后缀,很难能看出具体使用了什么视音频编码标准。总的来说,不同的封装格式之间差距不大,各有优劣。
在线观看其实是一种视频协议。也就是只有在有网络时通过浏览器或者移动端APP才能看到的视频。常见的直播流协议有:RTMP、RTSP、HTTP 等;常见的点播协议有:MP4、FLV、HLS 等。在连接视频协议时,除了音视频频流和metadata之外,可能还会携带播放的信令。
也有文章会把 视频协议 归入 视频封装格式。这么分类也有其道理:视频协议 和 视频封装格式 都同时携带了音视频和metadata,以及协议/格式需要的其他信息。以 FFMpeg
为例,并不区分视频格式和视频协议;但是 GStreamer
的话,还时需要指定 视频协议,但是不区分视频封装格式。
为什么会有视频编码
对于我们日常所看到的图形图像视频而言,其最终通过计算机,通过显示器呈现给我们的数据实际上是对应于屏幕上一个一个的点,我们称之为像素,而这种像素格式一般来讲就是 RGB 格式。RGB 想必大家并不陌生,其就是与自然界的三原色而对应。我们知道,红绿蓝三色的值在计算机中比较常用的表示方法是用 0-255 之间的一个数字来表示,那么表示红色在计算机中就需要 1 bytes 的空间,那么一个像素如果含有 RGB 三个分量,那么其就需要占用 3 bytes。
假设一张 1920 * 1080 大小的图片,其占用的字节数是 1920 * 1080 * 3 个 bytes,大约 5 MB。不知道大家是否知道视频的本质是什么,姑且解释一下,我们通过计算机看到的任何动态的东西,其本质就是一些静止的图片,当这些图片在单位时间内的数量比较大时,人眼将会看到其是连续动作的,一般这个临界值大概在 25 左右。那么也就是说一个视频的本质是每秒钟大于 25 的一些图片序列的集合。
image.png假设我们有一个 1920 * 1080 大小,时长 2 个小时的电影。我们不妨算一下其数据量的大小,每秒钟的图片张数姑且按 25 算,1920 * 1080 * 3 * 25 * 2 * 60 * 60,大约是 463 个G。而互联网的流量,是需要传播的,假设这一个视频要从 internet 内的 A 传送到 B,463 个 G 的带宽是什么概念。因此,我们便有了视频的编码,而所谓编码,其本质就是将数据压缩,进而减少带宽或存储空间的占用。
因此,他日若有人问你,编码是干什么的,你便可以回答:压缩。这也是本专栏讨论的核心内容。
视频播放器原理
既然有了编码,那么就会有对应的解码。视频在传输过程中经过媒体服务器可能发生再次编码和解码,但是无论如何,在用户的播放器内部还是需要解码才能观看,这里服务器编解码我们暂时不谈,主要来看看大家所熟悉的播放器编码实现原理。
视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:
-
解协议
-
解封装
-
解码视音频
-
视音频同步
如果播放本地文件则不需要解协议,为以下几个步骤:
-
解封装
-
解码视音频
-
视音频同步
它们的过程如图所示:
[图片上传失败...(image-6c467a-1703560162450)]
1. 解协议
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
2. 解封装
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
3.解码
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
4. 视音频同步
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
音视频原始数据格式和编解码标准
4.1 音频的原始数据格式和编解码标准
音频的原始数据格式主要有如下几种:
- PCM 格式
音频的编解码标准主要有如下几种:
-
MP3
-
AAC
-
AC-3
4.2 视频的原始数据格式和编解码标准
视频的原始数据格式主要有如下几种:
-
YUV 格式
-
RGB 格式
视频的编解码标准主要有如下几种:
-
H.264
-
H.265
-
MPEG2
这些原始数据格式和编解码标准初次看是有点陌生,但接触多了,也就逐渐熟悉了,先以掌握主流的编解码标准为主,这里也只是列出了其中一部分而已。
扩展
流媒体传输协议
常用的流媒体协议主要有HTTP渐进下载和基于RTSP/RTP的实时流媒体协议两类。在流式传输的实现方案中,一般采用HTTP/TCP来传输控制信息,而用RTP/UDP来传输实时多媒体数据。
数据压缩原理
压缩原理其实很简单,就是找出那些重复出现的字符串,然后用更短的符号代替,从而达到缩短字符串的目的。比如,有一篇文章大量使用"中华人民共和国"这个词语,我们用"中国"代替,就缩短了 5 个字符,如果用"华"代替,就缩短了 6 个字符。事实上,只要保证对应关系,可以用任意字符代替那些重复出现的字符串。本质上,所谓"压缩"就是找出文件内容的概率分布,将那些出现概率高的部分代替成 更 短 的 形 式 。 所 以 , 内 容 越 是 重 复 的 文 件 , 就 可 以 压 缩 地 越 小 。 比 如 ,“ABABABABABABAB"可以压缩成"7AB”。
相应地,如果内容毫无重复,就很难压缩。极端情况就是,遇到那些均匀分布的随机字符串,往往连一个字符都压缩不了。比如,任意排列的 10 个阿拉伯数字(5271839406),就是无法压缩的;再比如,无理数(比如 π)也很难压缩。
一些有名的算法: