七牛云6:付费视频防盗链-视频切片并通过AES128加密视频

蛰伏已久 蛰伏已久 2018-01-10

上一篇我们讲了通过七牛云的私有资源防止付费视频被盗链,今天我们学习一下七牛云的视频切片,并通过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>



七牛云视频切片接口规格

  1. avthumb/m3u8/noDomain/<NoDomain>

  2. /domain/<Domain>

  3. /segtime/<SegSeconds>

  4. /ab/<BitRate>

  5. /aq/<AudioQuality>

  6. /ar/<SamplingRate>

  7. /r/<FrameRate>

  8. /vb/<VideoBitRate>

  9. /vcodec/<VideoCodec>

  10. /acodec/<AudioCodec>

  11. /scodec/<SubtitleCodec>

  12. /subtitle/<SubtitleURL>

  13. /ss/<SeekStart>

  14. /t/<Duration>

  15. /s/<Resolution>

  16. /stripmeta/<StripMeta>

  17. /rotate/<Degree>

  18. /hlsKey/<HLSKey>

  19. /hlsKeyType/<HLSKeyType>

  20. /hlsKeyUrl/<HLSKeyUrl>

  21. /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秒一片):

  1. {

  2. "scope":                "qiniu-ts-demo:sample.mp4",

  3. "deadline":             1390528576,

  4. "persistentOps":        "avthumb/m3u8/noDomain/1/segtime/15/vb/240k",

  5. "persistentNotifyUrl":  "http://fake.com/qiniu/notify"

  6. }


主要还是通过配置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)