tcplayer 源码改造第一弹 -> 自定义加密

tcplayer 源码改造第一弹 -> 自定义加密前序简介主要介绍了基于 tcplayer 的源码改造 完成自定义的 hls 加密 保证知识产权不涉及 tcplayer 的使用以及框架如何调用 详情请看腾讯云点播文档源码解析中有些注释是笔者加的 如需定位 请不要复制注释人群适用于需要保护视频原作权的各类网站的开发人员不适合没有任何前端基础的小白 请谨慎观看 hls 自定义加密方案实现后端将上传到服务器的视频进行切片处理读取 m3u8 文

前序

简介

  • 主要介绍了基于tcplayer的源码改造,完成自定义的hls加密,保证知识产权
  • 不涉及tcplayer的使用以及框架如何调用,详情请看腾讯云点播文档
  • 源码解析中有些注释是笔者加的,如需定位,请不要复制注释
  • git仓库地址:

人群

  • 适用于需要保护视频原作权的各类网站的开发人员
  • 不适合没有任何前端基础的小白,请谨慎观看

git地址

https://github.com/HaverLee1/hls-player

hls自定义加密方案实现

  1. 后端将上传到服务器的视频进行切片处理
  2. 读取m3u8文件并保存到数据库
  3. 后端编写接口将m3u8文件以自定义加密的形式传递给前端
  4. 前端解密后放入播放器进行播放
  5. 如图所示
    hls自定义加密方案实现图
    本文章实现4、5两个步骤,后续将会增加步骤1、2、3(自定义hls加密播放,java+ffmpeg切片方案)。
    将实现基于tcplayer的自定义加密,将后端传递的加密数据解密后再放入原有的播放器进行播放。


准备工具

TCPlayerLite

可由腾讯点播获取

hls.js

同样也是腾讯提供的hls文件

ide

客官可随意,能用就行

源码改造(各位客官请自行格式化代码)

添加配置参数

在代码中定位videoSource,可定位到如下相似代码,下面的代码中加注释的即为笔者新增的参数

 function t(i, o) { 
    n(this, t); var s = l(o); M = ["od", "hd", "sd"]; var a = { 
    owner: i, videoSource: s, src: s.curUrl, autoplay: o.autoplay, live: o.live, flash: o.flash, flashUrl: o.flashUrl, poster: o.poster, width: o.width, height: o.height, volume: o.volume, listener: o.listener, wording: o.wording, controls: o.controls, clarity: o.clarity, clarityLabel: o.clarityLabel, showLoading: "boolean" != typeof o.showLoading || o.showLoading, pausePosterEnabled: void 0 === o.pausePosterEnabled || o.pausePosterEnabled, fullscreenEnabled: void 0 === o.fuScrnEnabled || o.fuScrnEnabled, systemFullscreen: o.systemFullscreen || !1, hls: o.hls || "0.12.4", h5_flv: o.h5_flv, x5_player: o.x5_player !== !1, x5_type: o.x5_type, x5_fullscreen: o.x5_fullscreen, x5_orientation: o.x5_orientation, x5_playsinline: o.x5_playsinline, preload: o.preload || "auto", hlsConfig: o.hlsConfig, flvConfig: o.flvConfig, // 表示加密的hls文件,设置该参数表示开启自定义加密 encryptHls: o.encryptHls, }; return r(this, e.call(this, a)) } 

去除m3u8文件校验

须知:若客官使用的api接口带有.m3u8字样,可跳过该步骤

由于笔者使用的接口本身不带有.m3u8字样,在直接播放时会出现播放失败的情况,调试发现在播放器中,加入了对文件名检验的处理。如源码所示:

var i = e.indexOf(".m3u8") > -1 || t == f.VideoType.M3U8, o = e.indexOf(".flv") > -1; 

考虑到业务需求上并不需要flv形式,并且保证传递的数据都是m3u8格式,所以在此时改为:

var i = 1, o = 0; // i=1表示为.m3u8文件,o=0表示不为.flv文件 

解密接口传来的m3u8索引文件

实际的播放并不在tcpalyer.js中,而是调用了另外的js,即hls.js,由下面的源码(tcplayer.js)可知,在没有指定hls的版本时,tcplayer默认使用0.12.4版本

// tcplayer.js hls: o.hls || "0.12.4", 

在hls.js文件中:

// hls.js e.readyState || e.open("GET", t.url, !0) 

此处调用了GET请求,即请求m3u8索引文件、ts文件、加密ts的key文件,而实际处理请求结果就在下面几行:

// hls.js var u = void 0, d = void 0; d = "arraybuffer" === o.responseType ? (u = t.response).byteLength : (u = t.responseText).length, n.loaded = n.total = d; 

本方案是加密m3u8索引文件,所以改成如下:

// hls.js // 将解密后的m3u8索引字符串赋值给u var u = 解密操作, d = void 0; d = "arraybuffer" === o.responseType ? (u = t.response).byteLength : (u = t.responseText).length, n.loaded = n.total = d; 

由于使用了改造过的hls.js文件,所以回到tcplayer.js文件,定位”f.CDNPath + r”,可以找到如下代码:

// tcplayer.js f.CDNPath='https://imgcache..com/open/qcloud/video/vcplayer/‘,r='libs/hls.min.0.12.4.js' var n = this, r = w[this.options.hls] || w["0.7.1"]; i ? (this.__type = f.VideoType.M3U8, "undefined" == typeof window.Hls ? h.loadScript(f.unifyProtocol(f.CDNPath + r), function () { 
    

将引用的hls.js文件加一个判断,如代码:

// tcplayer.js 加入对encryptHls的判断,如果设置了encryptHls蚕食,则使用自定义的hls.js文件进行解析 var n = this, r = w[this.options.hls] || w["0.7.1"]; i ? (this.__type = f.VideoType.M3U8, "undefined" == typeof window.Hls ? h.loadScript(f.unifyProtocol(this.player.options.encryptHls ? this.player.options.encryptHls : (f.CDNPath + r)), function () { 
    

使用说明

使用时请先压缩js文件

参数说明

在原有播放器支持的参数下添加了一个参数

参数 类型 默认值 参数说明
encryptHls String 表示调用的用于解析视频的hls文件,设置该参数表示开启自定义解析(可加入自定义加密),不设置该参数则表示使用tcplayer默认的解析

加入hls索引文件的自定义加密方式

hls.min.0.12.4_hava.js文件中定位’解密操作’字样,加入自定义的解密方式,将解密后的m3u8索引字符串赋值给u

使用示例

var player = new TcPlayer('id_test_video', { 
    "m3u8": "http://2157.liveplay.myqcloud.com/2157_a.m3u8", //请替换成实际可用的播放地址 "autoplay" : true, //iOS 下 safari 浏览器,以及大部分移动端浏览器是不开放视频自动播放这个能力的 "poster" : "http://www.test.com/myimage.jpg", "width" : '480',//视频的显示宽度,请尽量使用视频分辨率宽度 "height" : '320'//视频的显示高度,请尽量使用视频分辨率高度 "encryptHls": "./hls.0.12.4_hava.js", }); 

相关推荐

  • tcplayer源码改造第一弹 -> 自定义hls加密播放器
  • tcplayer源码改造第二弹 -> 加入倍速播放
  • tcplayer源码改造第三弹 -> 防盗录
  • tcplayer 源码改造第四弹 -> 字幕(srt)
  • tcplayer源码改造第五弹 -> 兼容sarafi/遨游
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232621.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Php公众号40029,微信公众平台开发:出现40029 code无效

    Php公众号40029,微信公众平台开发:出现40029 code无效本人写了一段用户授权的代码,出现错误:40029不合法的oauth_code问题。上网找了答案说是调用了两次请求,发回的code相同,所以失效。但是就是不知道为什么,我会发出两次请求。请求授权代码:deflogin(request):user=request.session.get(‘wx_user’,default=None)#如果用户之前没有关注ifuserisNone:ur…

    2022年6月3日
    77
  • Java io流文件读取和写入

    Java io流文件读取和写入Javaio流操作demo类1.读取操作/***@authorlxw*@date2020/6/24*@desc获取文件输入流,这里读入内存中*@param[fileName]*@returnbyte[]**/publicbyte[]readPdfFile(StringfileName)throwsException{InputStreamin=null;

    2022年5月7日
    37
  • springCloud五大核心组件「建议收藏」

    springCloud五大核心组件「建议收藏」1.springCloud五大组件运行流程2.springcloud简单介绍SpringCloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易。通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。SpringCloud的组件相当繁杂,拥有诸多子项目。重点关注Netfl…

    2022年4月19日
    120
  • 比较列存储索引与行索引

    比较列存储索引与行索引

    2021年11月26日
    38
  • awstats安装流程「建议收藏」

    awstats安装流程「建议收藏」我是直接从网站上下的rpm,然后rpm-ivh的然后直接安装到/usr/local/awstatsapache日志格式要使用combined:CustomLog"/var/log/httpd/access_log"combined我是用的logrotate每天断日志,然后将以前的日志打包成gz存放,于是昨天的日志就是access_log.1.gz添加主机(可以…

    2022年7月16日
    18
  • git 删除文件后如何恢复[通俗易懂]

    git 删除文件后如何恢复[通俗易懂]有时候不小心在git中rm了文件。怎么恢复呢?别急,咱们一步步来。首先gitstatus一把,看看此时工作区的状态[xxx@xxxstatic_files]$gitstatus#Onbranchmasternothingtocommit(workingdirectoryclean)可见此时没有任何修改的内容。再看看具体有什么xxx@xxxstatic_files]$

    2022年8月22日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号