七牛云6:付费视频防盗链-视频切片并通过AES128加密视频
上一篇我们讲了通过七牛云的私有资源防止付费视频被盗链,今天我们学习一下七牛云的视频切片,并通过AES128进行加密。
七牛云提供音视频切片接口以支持HLS(HTTP Live Streaming)播放。HTTP Live Streaming 是由 Apple 提出的基于 HTTP 的流媒体传输协议。它将一整个音频、视频流切割成可由 HTTP 下载的一个个小的音视频流,并生成一个 M3U8 播放列表,客户端只需要获取资源的 M3U8 播放列表即可播放音视频。
如下这是一个M3U8文件,可以看出里面包含了很多个小的视频文件
------------------华丽的分割线------------------
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:14
#EXT-X-KEY:METHOD=AES-128,URI="http://youdomain.com/get-key",IV=0x741f9b7345e36a6ea65f06f4fde35514
#EXTINF:13.680000,
/_XlEtgxmTLlscDTBmPgUbUcxzvA=/lgAqgKcNHyUXskDdH1iOqhet-hP_/000000.ts
#EXT-X-KEY:METHOD=AES-128,URI="http://youdomain.com/get-key",IV=0x09bd63ae40e8e948e7bf0db8880a2203
#EXTINF:10.000000,
/_XlEtgxmTLlscDTBmPgUbUcxzvA=/lgAqgKcNHyUXskDdH1iOqhet-hP_/000001.ts
#EXT-X-KEY:METHOD=AES-128,URI="http://youdomain.com/qiniu/get-key",IV=0x7522ef106dc5fb6d3220b2c2d7712451
#EXTINF:10.000000,
/_XlEtgxmTLlscDTBmPgUbUcxzvA=/lgAqgKcNHyUXskDdH1iOqhet-hP_/000002.ts
#EXT-X-KEY:METHOD=AES-128,URI="http://youdomain.com/get-key",IV=0xacb26644d440caac271c9386b0dd3026
------------------华丽的分割线------------------
我们只需要将m3u8文件传递给浏览器即可,它会自动拉取其中的视频列表。
<video controls autoplay > <source src="http://yourdomain.com/test.m3u8"> </video>
avthumb/m3u8/noDomain/<NoDomain>
/domain/<Domain>
/segtime/<SegSeconds>
/ab/<BitRate>
/aq/<AudioQuality>
/ar/<SamplingRate>
/r/<FrameRate>
/vb/<VideoBitRate>
/vcodec/<VideoCodec>
/acodec/<AudioCodec>
/scodec/<SubtitleCodec>
/subtitle/<SubtitleURL>
/ss/<SeekStart>
/t/<Duration>
/s/<Resolution>
/stripmeta/<StripMeta>
/rotate/<Degree>
/hlsKey/<HLSKey>
/hlsKeyType/<HLSKeyType>
/hlsKeyUrl/<HLSKeyUrl>
/pattern/<Pattern>
参数名称 | 类别 | 必填 | 说明 |
---|---|---|---|
/noDomain/<NoDomain> | A/V | 是 | 取值 0 或 1,默认为 0,推荐取值为 1。表示切片索引中的切片列表,是否使用相对地址,设置为 0 则使用绝对地址,设置为 1 则使用相对地址。 |
/domain/<Domain> | A/V | 用户指定切片中ts文件的域名。 注意:域名需要urlbase64编码,且不能带http;该参数不能和noDomain/1共同使用。 | |
/segtime/<SegSeconds> | A/V | 用于自定义每一小段音/视频流的播放时长,单位为秒,取值范围为5-120秒,默认值为10秒。 | |
/ab/<BitRate> | A | 静态码率 (CBR),单位为比特每秒 (bit/s),常用的码率有:64k,128k,192k,256k,320k等。 | |
/aq/<AudioQuality> | A | 动态码率 (VBR),取值范围为0-9,值越小码率越高。不能与静态码率参数共用。 | |
/ar/<SamplingRate> | A | 音频采样频率,单位为赫兹 (Hz),常用的采样频率有:8000,12050,22050,44100等。 | |
/r/<FrameRate> | V | 视频帧率,每秒显示的帧数,单位为赫兹 (Hz),常用的帧率有:24,25,30等,一般用默认值。 | |
/vb/<VideoBitRate> | V | 视频比特率,单位为比特每秒 (bit/s),常用的视频比特率有:128k,1.25m,5m等。 | |
/vcodec/<VideoCodec> | V | 视频编码方案,支持的方案有:libx264,libvpx,libtheora,libxvid等,默认为libx264。 | |
/acodec/<AudioCodec> | A | 音频编码方案,支持的方案有:libmp3lame,libfaac,libvorbis等。 | |
/scodec/<SubtitleCodec> | V | 字幕编码方案,支持的方案有:mov_text。该参数仅用于修改带字幕视频的字幕编码。 | |
/subtitle/<SubtitleURL> | V | 添加字幕,支持:srt格式字幕 (uft-8编码和和utf-8 BOM编码),带有字幕的mkv文件,embed (将原视频的字幕流嵌入目标视频)。基于base64编码。 | |
/ss/<SeekStart> | V | 指定视频截取的开始时间,单位为秒,支持精确到毫秒,例如3.345s。用于视频截取,从一段视频中截取一段视频。 | |
/t/<Duration> | V | 指定视频截取的长度,单位为秒,支持精确到毫秒,例如1.500s。用于视频截取,从一段视频中截取一段视频。 | |
/s/<Resolution> | V | 指定视频分辨率,格式为:<width>x<height> ,或者预定义值。 | |
/stripmeta/<StripMeta> | A/V | 是否清除文件的metadata,1为清除,0为保留。 | |
/rotate/<Degree> | V | 指定顺时针旋转的度数,取值可为:90,180,270,auto,默认为不旋转。 | |
/hlsKey/<HLSKey> | A/V | AES128加密视频的秘钥,必须是16个字节。 | |
/hlsKeyType/<HLSKeyType> | A/V | 密钥传递给我们的方式,0或不填。1.x(1.0, 1.1, ...):见下面详细解释。 | |
/hlsKeyUrl/<HLSKeyUrl> | A/V | 密钥的访问url | |
/pattern/<Pattern> | A/V | 为各音视频流ts文件自定义命名。 因为一整段音视频流音视频切片后会生成一个M3U8播放列表和多个默认命名的音视频流ts文件。示例:avthumb/m3u8/noDomain/1/pattern/eGlhb3hpYW8kKGNvdW50KQ==,其中eGlhb3hpYW8kKGNvdW50KQ==是自定义ts文件名,如:qiniu$(count)的URL安全的Base64编码,其中$(count)是必须存在的六位占位符数字串,qiniu可以自己定义。最后得到类似:qiniu000000,qiniu000001,……,qiniu000006命名的ts文件。 |
示例
以预转持久化形式,将 mp4 视频按 vb/240k 预设规格切片(15秒一片):
{
"scope": "qiniu-ts-demo:sample.mp4",
"deadline": 1390528576,
"persistentOps": "avthumb/m3u8/noDomain/1/segtime/15/vb/240k",
"persistentNotifyUrl": "http://fake.com/qiniu/notify"
}
主要还是通过配置persistentOps来实现上传后自动进行切片,也可以在上传后调用视频切片接口,后面有范例代码。
hls加密
hls加密是利用AES-128位对每个ts文件进行加密,播放器在取得PlayList文件的时候,会根据里面的#EXT-X-KEY
标签请求获得解密的URL,再请求解密密钥,之后会用密钥对获取的ts文件解密。用户可以对密钥的URL做cookie验证等方法来对用户做认证。 例子:PlayList文件 (复制链接,查看文件内容或直接用vlc播放器播放)
参数解释:
hlsKey
: base64_urlsafe编码或加密过后的密钥
hlsKeyUrl
: 指定了密钥放置的url,经过base64_urlsafe编码,这是生成m3u8 PlayList会使用到的,浏览器会向这个地址索取加密的密钥,如果返回的密钥不正确,视频是没法正常播放的,我们可以在这个url接口中,加入我们的业务逻辑,比如如果访问者未登录,则不返回密钥,或者非会员访问不返回密钥等等,以实现我们对视频文件的控制
hlsKeyType
: 指定了传送秘钥的方式
不指定或者指定为0,则仅仅是以base64_urlsafe编码的方式传送。
指定为1.x(1.0, 1.1, ...),以RSA的OAEP加密方式,再以编码传送密钥,x表示密钥的版本
公钥:1.0
音视频切片PHP后台代码
我们使用了七牛的PHP SDK,其中hlsKey后面的数据为加密密钥,16字节,并使用安全的base64编码,hlsKeyUrl后面为返回密钥的接口,浏览器播放m3u8的时候,会向该接口请求密钥。
$accessKey =qn_accesskey; $secretKey = qn_secretkey; $auth = new Auth($accessKey, $secretKey); //要转码的文件所在的空间和文件名。 $bucket = qn_bucket; $key = '3WPart1003.mp4'; //转码是使用的队列名称。 https://portal.qiniu.com/mps/pipeline $pipeline = '';//为空代表使用七牛公用队列 //转码完成后通知到你的业务服务器。 $notifyUrl = ''; $pfop = new PersistentFop($auth, $bucket, $pipeline, $notifyUrl); //要进行转码的转码操作。 http://developer.qiniu.com/docs/v6/api/reference/fop/av/avthumb.html $fops = "avthumb/m3u8/noDomain/1/segtime/10/hlsKey/".\Qiniu\base64_urlSafeEncode("abcdefgh12345678")."/hlsKeyType/0/hlsKeyUrl/".\Qiniu\base64_urlSafeEncode("http://youdomain.com/get-key"); list($id, $err) = $pfop->execute($key, $fops); echo "\n====> pfop avthumb result: \n"; if ($err != null) { var_dump($err); } else { echo "PersistentFop Id: $id\n"; } //查询转码的进度和状态 list($ret, $err) = $pfop->status($id); echo "\n====> pfop avthumb status: \n"; if ($err != null) { var_dump($err); } else { var_dump($ret); }
返回密钥代码
即上面的接口http://youdomain.com/get-key
我这里只添加了一个逻辑,即如果用户登录了,我就返回密码,不登录我就什么也不返回
if(!Yii::$app->user->isGuest){ echo "abcdefgh12345678"; }
前端视频播放代码,使用h5的video,不过在PC中,只有safari才能播放这种m3u8格式的视频,后面我们也会继续探讨,m3u8的播放问题。
<video controls autoplay > <source src="http://yourdomain.com/test.m3u8"> </video>
点赞(1)