前言
公司需求,上传的视频需要加上公司Logo,同时播放需要采用流式播放禁止下载。 现有的环境在阿里云上,所以自然想到了阿里云的产品【媒体处理】的转码功能。
转码配置
配置比较简单,采用阿里云HLS标准加密方式 参考阿里云官方文档即可【文档地址】,采用工作流方式,自动触发。
流程图如下。
工作流的配置需要额外注意的是KeyUri,该Url为业务站点应用对应的视频解密api, 此Url会在MPS加密后自动写入m3u8文件中,播放器播放时在解析m3u8文件后,也会自动请求该Url,将读取到的ts文件进行解密播放。
解密与播放
流程图
解密服务
这里可以按照自己的开发语言,我这边使用的是.net core。 官方文档提供了python和java 两个版本,调用Kms密钥服务将密文进行解密。
一个简单的m3u8文件如下
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:5 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:METHOD=AES-128,URI="https://example.aliyundoc.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b****" #EXTINF:4.127544, 15029611683170-00001.ts #EXT-X-ENDLIST
其中Ciphertext为密文,MediaId 为媒体服务对应的mediaId,播放时使用。
解密api的请求代码如下(C#)
private Client CreateClient() { Config config = new Config { // 您的AccessKey ID AccessKeyId = _config.AccessKeyId, // 您的AccessKey Secret AccessKeySecret = _config.AccessKeySecret, Endpoint = _config.Endpoint, }; return new Client(config); }
private async Task<string> DecryptRequest(string mediaId, string ciphertext) { var client = CreateClient(); DecryptRequest request = new DecryptRequest(); request.CiphertextBlob = ciphertext; try { DecryptResponse response = await client.DecryptAsync(request); string plaintext = response.Body.Plaintext; Console.WriteLine($"plaintext:{plaintext}"); Console.WriteLine($"KeyId:{response.Body.KeyId}"); Console.WriteLine($"KeyVersionId:{response.Body.KeyVersionId}"); Console.WriteLine($"RequestId:{response.Body.RequestId}"); return plaintext; } catch (Exception ex) { throw ex; } }
不过按理来讲需要在这里要额外校验当前用户的身份,如果没有对应的身份标识,则应该返回httpCode 403. 验证标识的方式可采用 cookie token或其他方式,但这块儿的http请求是由 Aliplayer发出的,在前后端分离的项目中暂时还不清楚如何在请求头上加上自己的临时票据 也就是上面播放流程图中的MtsHlsUriToken参数,需要请教大佬解答了。
视频播放
视频播放可以采用两种方式即 播放地址播放和mps用户方式播放。
播放地址播放
因为视频时采用HLS标准加密的,如果想要使用播放地址进行播放的话,需要将视频所在的bucket公开才可以。 否则会导致aliplayer无法读取.ts视频段
MPS用户播放