您好,本篇文章将由浅入深介绍M3U8视频格式及视频加密切片和市面上常见的加密防护托管方案。
前言
近几年来知识付费的概念越来越受到欢迎,那么作为视频网校方而言,如何保证用户体验的前提下,防止视频资源被下载,低价贩卖传播,维护讲师和平台的利益,就成为了一个急需解决的问题。
常见的视频格式
后缀名 |
介绍 |
创造者 |
.mp4 |
目前用途十分广泛的视频格式,例如网络电影、手机拍摄的视频、智能设备拍摄的视频、宣传片、MV等。.mp4具有在较小的文件属性下,拥有接近DVD画质的视频图像质量文件。 |
Moving Picture Experts Group-4(运动图像专家组) |
.m4v |
一种应用于网络视频点播网站和移动手持设备的视频格式,是MP4格式的一种特殊类型,其后缀常为.MP4或.M4V,其视频编码采用H264,音频编码采用AAC。 |
苹果公司 |
.mov |
一种音频、视频文件封装,用于存储常用数字媒体类型。 |
苹果公司 |
.avi |
这个视频格式的文件,体积较同等时间、分辨率、音质码流等条件下偏大,其压缩方式众多;在二十年前,很多文件是以AVI格式来传播、拷贝的,目前,使用者不如之前多了。 |
微软公司 |
.wmv |
在十几年前的流媒体mms时代,这种格式的视频文件和rm格式视频文件,备受欢迎,压缩比率高,画质损失也比较严重;使用的是SMPTE 421M标准,但是这种格式视频,这些年似乎不再流行。 |
微软公司 |
.flv |
这种格式的文件,其特点是体积特别小,但是画质音质都损失严重。随着flash淡出历史舞台,这种格式的视频文件,也已不再流行。 |
Adobe |
.mkv |
能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是Matroska定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。 |
CoreCodec Inc |
我们最熟悉和常见的就是 MP4 格式了,但是目前90%的视频网站,却采用了 M3U8 格式
M3U8格式
HLS(HTTP Live Streaming) 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。
M3U文件是记录了一个索引纯文本文件,可以指定一个或多个多媒体文件的位置,其文件扩展名是“M3U”或者“m3u”。打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。M3U文件的作用通常是创建指向在线流媒体的播放列表,创建的文件可以轻松访问流媒体。
M3U8是Unicode版本的M3U,用UTF-8编码。
m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。
当 m3u8 文件作为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。对于点播来说,客户端只需按顺序下载片段资源,依次进行播放即可。而对于直播来说,客户端需要定时重新请求该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。
当 m3u8 作为主播放列表(Master Playlist)时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Strean)。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。
m3u8 文件要么是媒体播放列表,要么是主播放列表。但无论是哪种列表,其有效组成均由两部分构成:
- 以 #EXT 开头的为标签信息,作为对媒体资源的进一步描述;
- 剩余的为资源信息,要么是片段资源(Media Playlist)路径,要么是 m3u8 资源(Master Playlist)路径;
m3u8文件遵循的条件
- m3u8 文件必须以 utf-8 进行编码,不能使用 Byte Order Mark(BOM)字节序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
- 每一行要么是一个 URI,要么是空行,要么就是以 # 开头的字符串。不能出现空白字符,除了显示声明的元素
- 以 # 开头的字符串要么是注释,要么就是标签。标签以 #EXT 开头,大小写敏感。
常用标签
标签名 |
功能介绍 |
EXT-X-DISCONTINUITY |
该标签表明其前一个切片与下一个切片之间存在中断。EXT-X-DISCONTINUITY 的一个经典使用场景就是在视频流中插入广告,由于视频流与广告视频流不是同一份资源,因此在这两种流切换时使用 EXT-X-DISCONTINUITY 进行指明,客户端看到该标签后,就会处理这种切换中断问题,让体验更佳。 |
EXT-X-KEY |
媒体片段可以进行加密,而该标签可以指定解密方法。 |
EXT-X-PLAYLIST-TYPE |
表明流媒体类型。全局生效。该标签为可选标签。 可选值如下:【VOD】 即 Video on Demand,表示该视频流为点播源,因此服务器不能更改该 m3u8 文件;【EVENT】 表示该视频流为直播源,因此服务器不能更改或删除该文件任意部分内容(但是可以在文件末尾添加新内容) |
EXT-X-PROGRAM-DATE-TIME |
该标签使用一个绝对日期/时间表明第一个样本片段的取样时间。 |
EXT-X-MEDIA-SEQUENCE |
表示播放列表第一个 URL 片段文件的序列号,每个媒体片段 URL 都拥有一个唯一的整型序列号。 每个媒体片段序列号按出现顺序依次加 1。媒体片段序列号与片段文件名无关。如果该标签未指定,则默认序列号从 0 开始。 |
EXT-X-ENDLIST |
若出现EXT-X-ENDLIST标签,则表明M3U8文件不会再产生更多的切片,可以理解为该M3U8已停止更新,并且播放分片到这个标签后结束。M3U8不仅仅是可以作为直播,也可以作为点播存在,在M3U8文件中保存所有切片信息最后使用EXT-X-ENDLIST结尾,这个M3U8即为点播M3U8。EXT-X-ENDLIST标签可能会出现在播放列表文件的任何地方,但是不能出现两次或以上。 |
EXT-X-STREAM-INF |
EXT-X-STREAM-INF标签出现在M3U8时,主要是出现在多级M3U8文件中时,例如M3U8中包含子M3U8列表,或者主M3U8中包含多码率M3U8时;该标签后需要跟一些属性,下面就来逐一说明一下这些属性:【BANDWIDTH】:BANDWIDTH的值为最高码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的最大码率(必要参数)。【AVERAGE-BANDWIDTH】:AVERAGE-BANDWIDTH的值为平均码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的平均码率(可选参数)。【CODECS】:CODECS的值用于声明EXT-X-STREAM-INF下面对应M3U8里面的音视频编码、视频编码的信息(可选参数)。【RESOLUTION】:M3U8中视频的宽高信息描述(可选参数)。【FRAME-RATE】:子M3U8中的视频帧率(可选参数)。 |
...省略 |
如果感兴趣,可以去购买《FFmpeg从入门到精通》书籍或者查阅ffmpeg官方文档(英文版) http://www.ffmpeg.org/ffmpeg-all.html |
客户端播放M3U8的一些标准
- 分片必须是动态改变的,序列不能相同,并且序列必须是增序的
- 当M3U8没有出现EXT-X-ENDLIST标签时,无论这个M3U8列表中有多少个分片,播放分片都是从倒数第三片开始播放,如果不满3片则不应该播放。当然如果有些播放器做了特别定制了,则可以不遵照这个原则。
- 以播放当前分片的duration时间刷新M3U8列表,然后做对应的加载动作。
- 如果播放列表在刷新之后与之前的列表相同,那么在播放当前分片duration一半的时间内在刷新一次。
- 前一片分片和后一片分片有不连续的时候,播放可能会出错,那么需要X-DISCONTINUTY标签来解决这个错误。
注意事项
- 有两种请求 m3u8 播放列表的方法:一是通过 m3u8 的 URI 进行请求,则该文件必须以 .m3u8 或 .m3u 结尾;二是通过 HTTP 进行请求,则请求头 Content-Type 必须设置为 application/vnd.apple.mpegurl 或者 audio/mpegurl。
- 空行和注释行在解析时都忽略。
- 媒体播放列表(Media Playlist)的流资源总时长就是各切片资源的时长之和。
TS文件格式
- TS(Transport Stream)是一种音视频封装格式,全称MPEG2-TS。MPEG-TS主要应用于实时传送的节目,比如实时广播的电视节目。
- TS文件(流)可以分为三层:TS层(Transport Stream)、PES层(Packet Elemental Stream)、ES层(Elementary Stream)。
- ES层就是音视频数据,PES层是在音视频数据上加了时间戳等对数据帧的说明信息,TS层是在PES层上加入了数据流识别和传输的必要信息。TS文件(码流)由多个TS Packet组成的。
TS文件(码流)的分层结构图
PES包头示例,47开头要记住
ES ,PES, TS关系如图(请仔细看这个图,它准确的解释了解ES的原理)
TS包有效载荷图解
从图可以看出TS包的有效载荷分为PSI(节目特定信息) 和 PES。而PSI又分为PAT表和PMT表,各表所在TS包的PID参考上面的 “表2-3 PID表”。分别给出各句法说明
PAT表 (节目相关表)
PES理解
- PES = Packetized Elementary Stream
- PES的payload是按照ES顺序的数据流
- 一个PES就是一个音频或视频的sample
- PES包头中含有timestamp信息
- PES被分成多个TS包后,第一个TS包中含有PES包头,中间TS包大多数情况只含ES数据,极少数含调整字段和ES数据,极个别夹杂着不含ES数据而只有调整字段的TS包,只有最后一个TS包可能需要填充调整字段补齐188字节。
- 音视频的PES的PID通过PMT表信息得到。
解TS的方法
- 先找到PID为0x00 的TS包,找到里面的节目映射表(PMT)PID,因为可能有几个节目信息,所以可能有几个PMT_PID,以一个为例。
- 接着查找该PMT_PID得TS包,通常就紧接着。在该PMT包中找音频和视频的PID。以视频为例。
- 开始提取一帧ES数据:
- 查找视频PID的TS包
- 找PES包头,方法:TS包头第2个字节的高6位(有效载荷单元起始指示符)为1的TS包,跳过调整字段(自适应字段),找到PES包头,提取时间戳,再跳至ES数据,这就是一帧ES数据的开始部分
- 查找有效载荷单元起始指示符为0的TS包。跳过TS包头,跳过自适应字段(有的话),提取后面的ES数据
- 同c 接着查找。
- 当碰到有效载荷单元起始指示符又变为1的视频TS包,就知道这是下一帧的开始了,将前面的所有ES数据组合成一帧数据。开始下一轮组帧。
TS流生成流程
- 将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)。
- 对ES(基本码流)进行打包形成PES。
- 在PES包中加入时间戳信息(PTS/DTS)。
- 将PES包内容分配到一系列固定长度的传输包(TS Packet)中。
- 在传输包中加入定时信息(PCR)。
- 在传输包中加入节目专用信息(PSI) 。
- 连续输出传输包形成具有恒定比特率的MPEG-TS流。
TS流解析流程
- 复用的MPEG-TS流中解析出TS包;
- 从TS包中获取PAT及对应的PMT;
- 从而获取特定节目的音视频PID;
- 通过PID筛选出特定音视频相关的TS包,并解析出PES;
- 从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;
- 将ES交给解码器,获得压缩前的原始音视频数据。
目前最常见的盗版形式
方案 |
过程 |
下载 |
通过技术手段直接从网页端/客户端/H5页面下载视频 |
录屏 |
就是在观看视频的时候同步录制视频内容 |
明确了盗版路径,要做的就是对症下药。
针对【录屏】的安全防护解决方案
对小窗录屏/全屏录屏等行为起到强有力的震慑作用。
- 通过播放器实时监测,如果检测到视频处于录屏状态或小窗待录屏状态,视频会立即停止播放,以此来防止视频被盗取。
- 将用户ID、电话号码或其他信息内容等以跑马灯的形式展现在视频上,实现设定文字在视频上不规则地跑动,可追溯录屏者身份
- 在视频中添加用户专属的视频水印,从而让视频中融入企业的版权信息,防止盗录者盗取版权,保护公司的知识产权。
- 视频播放到某个时间点,弹出问答播放器,只有答题正确,提交后才能继续观看,增加了录屏的难度,提高录屏成本,大大降低盗版视频的观看体验。
为什么要对视频切片?
普通场景
- 相信大家都有这样的经历,一个视频太大,放到服务器上面,播放的时候,受服务器宽带和自己网络的影响访问会很慢。
- 经常看视频的小伙伴肯定看到过下面的场景,网页上视频播放的时候,会有一个m3u8的请求,然后再去请求key,再一个ts一个ts的下载。
- 这样有什么好处呢?就是当你视频五六百兆的大小,你可以通过工具将视频切片成一个个5兆大小的ts。
- 然后生成m3u8文件,m3u8文件中包含每一个ts的名字和加密的key。
- 这样播放的时候,会一个一个的去获取ts文件,因为ts文件的大小5兆左右,一般来说,普通服务器上就能很快的访问到。
加密场景
- 比如说公司要求在视频播放快的基础上,还要保证视频不能被别人下载,也可以采用这个方式
- 将mp4切片然后加密。然后对key的获取做限制,这样别人也就无法下载你的视频了。
部分影视站图床白嫖原理
- 目前很多盗版影视站,ts流媒体视频文件,不存自己服务器,而是通过某些大平台的上传页面抓包,使用它们的图床
- 有些没对图片接口做文件限制的,就被白嫖了
- 这么做对于影视站来说,节约存储和带宽访问成本,对图床来说,增加了成本
- 当然也有做文件限制的,检测是否为图片格式,通常是检测开头的几个字节。如【PNG】是 89 50 开头
- 但是又出现了,对ts文件的开头拼接假图片(花屏,小尺寸图片),实现伪造真图片来欺骗接口的文件检测的效果实现上传成功的目的
当然这种做法我是不赞同的,如果您是服务商,请检查上传图片的接口,防止被滥用。
使用FFMPEG对MP4视频切片生成加密的M3U8文件
所需软件:
如果出现了【不是内部或外部命令,也不是可运行的程序】请参考以下方案,操作步骤:
- 您可以先把两个软件的所在目录添加到环境变量
- 或者调用时使用绝对路径(E:\OVVO\ffmpeg.exe)
- 或者放到同目录
导出随机16位字节到enc.key文件
openssl rand 16 > enc.key
生成随机 iv 偏移 十六进制 字符串,记下来
openssl rand -hex 16
新建一个文件 enc.keyinfo 内容格式如下:
Key URI # enc.key的路径,使用http形式
Path to key file # enc.key文件
IV # 上面生成的iv
举个例子:enc.keyinfo内容如下:
https://xxx/OVVO/enc.key
/OVVO/enc.key
59147068b6158bd311859d28f5ace301
视频分片,这里先用命令进行视频分片加密
ffmpeg -y \
-i "E:\OVVO\test.mp4" \
-hls_time "3" \
-hls_key_info_file "E:\OVVO\enc.keyinfo" \
-hls_playlist_type "vod" \
-hls_list_size "0" \
-hls_segment_filename "E:\OVVO\file%d.ts" \
"E:\OVVO\playlist.m3u8"
-i:要切片的原视频文件
-hls_time:指定生成 ts 视频切片的时间长度s秒
hls_key_info_file:enc.keyinfo文件的位置
hls_list_size: 索引播放列表的最大列数 默认5,0 为不限制
hls_segment_filename:生成ts和m3u8文件的路径及文件名
最终一行命令
ffmpeg -y -i "E:\OVVO\test.mp4" -hls_time "3" -hls_key_info_file "E:\OVVO\enc.keyinfo" -hls_playlist_type "vod" -hls_list_size "0" -hls_segment_filename "E:\OVVO\file%d.ts" "E:\OVVO\playlist.m3u8"
等待几秒,切片完成,如下图,多出了【.ts】和【.m3u8】文件
m3u8文件的内容
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x59147068b6158bd311859d28f5ace301
#EXTINF:4.133333,
file0.ts
#EXTINF:3.700000,
file1.ts
#EXTINF:4.166667,
file2.ts
#EXTINF:1.833333,
file3.ts
#EXTINF:2.933333,
file4.ts
#EXT-X-ENDLIST
为何我定义的每个碎片3秒,实际有4,3,4,1,2不固定?这是因为关键帧问题,也可以得到解决。
如何本地播放看效果?
前置软件
-
下载phpStudy(PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等。)
-
下载Play HLS M3u8(浏览器插件)
在【E:\OVVO】目录,将生成的【.m3u8】【.key】【*.ts】移动到【D:\phpStudy\PHPTutorial\WWW】
然后在浏览器按下F12(开发者调试工具),打开本地网址,即可看到视频效果。
http://localhost/playlist.m3u8
选择key文件看看响应值,奇怪?为什么是红色字符?因为那是不可见的(详细请查看ASCII码值表),如果直接复制会造成不一致的情况。
那有什么办法能得到十六进制?可以下载010 Editor(专业文本/十六进制编辑器),打开【enc.key】文件,第一行就是了。
市面上的视频托管平台
目前极少网站采用了这个新型格式,WebAssembly(简称wasm)是一个虚拟指令集体系架构(virtual ISA),整体架构包括核心的ISA定义、二进制编码、程序语义的定义与执行,以及面向不同的嵌入环境(如Web)的应用编程接口(WebAssembly API)。其初始目标是为C/C++等语言编写的程序经过编译,在确保安全和接近原生应用的运行速度更好地在Web平台上运行。
- 新某某(Webassembly,分段key(如1-10碎片是一个key,11-20是另外一个key),使用Nodejs补环境就行)
- 某某威,32位key
某某威版本 |
结论 |
V10 |
M3U8和KEY,均在JS层处理,AES算法 |
V11 |
Webassembly传递TS和某些值,返回解密后的TS,其中内部计算解密了key,当然也可以在内存的Buffer中Uint8Array截取得到,也可Nodejs调用,或魔改wasm,返回结果 |
V1102 |
同上,换了下盐 |
V1103 |
同上,换了下盐 |
V12 |
Webassembly封装了ffmpeg库,输出的是YUV抛给Canvas渲染,实际只要反混淆下文件头就可以 |
如何逆向wasm?请翻阅漁滒的文章
wasm转c调用与封装至dll案例
wasm转c调用实战
某网站字幕加密的wasm分析
托管平台 |
结论 |
某某场景 |
21位KEY |
某家云 |
反混淆文件头,取前一段字节,运算替换下就行 |
某度云 |
对KEY进行了AES加密 |
阿某某 |
JSVMP层生成随机数,并同时计算KEY,之后在PES层处理,不同于标准的AES-128-CBC而它是ECB算法 |
七某某 |
对m3u8和ts链接做时效限制,过期后就打不开了 |
慕某某 |
动态加密m3u8和key值 |
腾某某 |
16位KEY,并不是真正的,有JSVMP生成临时随机key和iv,再取返回值AES解密后才是 |
气某某 |
20位KEY,算法细节就是,针对部分第几位的值运算,如果请求二次后返回的是假的随机key |
i某某 |
xxtea算法,canvas有指纹同时运算才是 |
我要某某某 |
对m3u8和key动态加密 |
还有很多 |
不一一列举 |
需要你掌握HTTP协议,JS逆向的知识,并断点分析【Hls.js】脚本,就可以得到如上结论。
正所谓,知己知彼百战百胜,我们看到了,核心关键在与key的保护
针对【key】的安全防护解决方案
- 通过以上的操作,我们暂时是实现了本地对视频切片,并生成【.m3u8】和【.key】和【.ts】
- 现在的关键就在与【.key】的安全性,正常来说,是16位字节的,需要对它二次加密。
- HLS加密技术:也可以称之为m3u8切片加密,这种是目前H5时代广泛使用的技术,该加密本身是很安全的,基于AES加密算法。但有个致命的问题:别人很容易拿到秘钥进行解密。这种方式最大的优点是:几乎主流浏览器都支持,包括微信、qq等,打开就能播放,兼容性很好。缺点也很明显
- 因为算法是公开的,并且如果不保护好秘钥文件,ffmpeg等命令行、很多工具软件,均可拿到秘钥对视频基本还原,如果只是采用单纯的HLS加密技术,可以说:极其不安全。幸好,近几年国内很多厂商在标准HLS加密的基础上,对m3u8文件中的秘钥等做了防盗处理,这种二者结合,效果就好很多。
防盗链技术:这种严格来说,不属于视频加密,只是想办法防止视频被下载,只允许在线播放。但这种基本上来说属于防一般用户,很容易被绕过去。因为你只要让浏览器可以播放,别人就可以伪装自己是浏览器,拿到url,进行伪装浏览器的各种referer等信息,欺骗过防盗链系统,下载到视频。
防护种类 |
细节 |
key身份鉴权 |
服务器验证Cookie是否购买 |
key时效鉴权 |
若已购,则下发含【?t=1662901149&sign=2dc85bcdf05fad8d308000b0691b7c60】的链接,做时间限制,若10秒后访问就不给值了 |
次数限制 |
只允许访问一次 |
IP白名单 |
拒绝或只允许特定IP访问 |
Referer |
基于HTTP Header跟踪来源,但可以伪造 |
user-agent |
基于HTTP Header跟踪来源,但可以伪造 |
Cookie |
基于用户信息跟踪来源 |
电脑端
视频文件内容采用私有算法真正逐帧加密:这种方式一般是基于不公开的算法,对视频文件、直播流、m3u8中的ts数据等,均可实现实时逐帧加密。但加密后的视频,需要专用特定播放器才可以播放。由于采用私有算法,因此其他播放器无法进行播放,增强了安全性。但也带来了一定不便利性,就是必须安装专用软件。不过这类技术就比较考验加密实力了,目前很多加密软件号称加密,但某宝等平台随便一搜,也有很多破解。因为,即使你用了专用播放器,但如果别人很容易逆向你的播放器,也就知道了加密算法,所以需要开发公司有多年深厚的研发实力才可以放心。
针对于试看业务逻辑的,防止白嫖方案
如果业务允许视频试看前2分钟,那么m3u8如下
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x59147068b6158bd311859d28f5ace301
#EXTINF:4.133333,
000.ts
#EXTINF:3.700000,
001.ts
#EXTINF:4.166667,
002.ts
#EXTINF:1.833333,
003.ts
#EXTINF:2.933333,
004.ts
#EXT-X-ENDLIST
根据切片命名自增规则,之后的文件就是【005.ts】【006.ts】盲猜,循环取响应值,就能拼接出完整的m3u8了
如何解决?
切片完,对所有.ts文件,已随机命名
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="key.txt"
#EXTINF:5.000000,
7bc1edc0a66379b6.ts
#EXTINF:5.000000,
68029aa7c69383c9.ts
#EXTINF:5.000000,
ad0a6b20b5225a93.ts
#EXTINF:5.000000,
458981605103f4d8.ts
#EXTINF:5.000000,
238684a014581aee.ts
#EXT-X-ENDLIST
分析时链接是blob?
Blob和ArrayBuffer是什么鬼?
- 最早是数据库直接用Blob来存储二进制数据对象,这样就不用关注存储数据的格式了。在web领域,Blob对象表示一个只读原始数据的类文件对象,虽然是二进制原始数据但是类似文件的对象,因此可以像操作文件对象一样操作Blob对象。
- ArrayBuffer对象用来表示通用的、固定长度的原始二进制数据缓冲区。我们可以通过new ArrayBuffer(length)来获得一片连续的内存空间,它不能直接读写,但可根据需要将其传递到TypedArray视图或 DataView 对象来解释原始缓冲区。实际上视图只是给你提供了一个某种类型的读写接口,让你可以操作ArrayBuffer里的数据。TypedArray需指定一个数组类型来保证数组成员都是同一个数据类型,而DataView数组成员可以是不同的数据类型。
TypedArray视图的类型数组对象有以下几个:
Int8Array:8位有符号整数,长度1个字节。
Uint8Array:8位无符号整数,长度1个字节。
Uint8ClampedArray:8位无符号整数,长度1个字节,溢出处理不同。
Int16Array:16位有符号整数,长度2个字节。
Uint16Array:16位无符号整数,长度2个字节。
Int32Array:32位有符号整数,长度4个字节。
Uint32Array:32位无符号整数,长度4个字节。
Float32Array:32位浮点数,长度4个字节。
Float64Array:64位浮点数,长度8个字节。
Blob与ArrayBuffer的区别是,除了原始字节以外它还提供了mime type作为元数据,Blob和ArrayBuffer之间可以进行转换。
File对象其实继承自Blob对象,并提供了提供了name , lastModifiedDate, size ,type 等基础元数据。
视频加密防护发展方向
- 浏览器端实现 WebAssembly 播放器(相对于JS层而言,难度提升了,调试也都是压栈出栈等指令的操作)
- 谷歌的WideVine数字版权管理(DRM)