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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python九九乘法表逆序_python九九乘法表-详解(转发)

    python九九乘法表逆序_python九九乘法表-详解(转发)都说 python 入门级别最基本都要求写九九乘法表 金字塔等 最近只研究了九九乘法表代码如下 代码详解 为了让自己理解 foriinrange 1 10 print i end forjinrange 1 i 1 print s s s i j i j end print 1 foriinrange 1 10 这是一个 for 循环

    2025年11月12日
    5
  • base编码器_base100编码

    base编码器_base100编码Base64编码是一种基于64个可打印字符来表示二进制数据的方法。目前Base64已经成为网络上常见的传输8位二进制字节代码的编码方式之一。为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如:传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制。图片的二进制流的每个字节不可能全部是可…

    2022年10月9日
    4
  • idea快捷键不生效_idea列模式快捷键

    idea快捷键不生效_idea列模式快捷键1、如果是某些快捷键不气作用,这有可能与通讯工具、输入法、浏览器等的快捷键冲突2、如果所有的快捷键都不气作用,这时点击idea开发工具上的“Tools”然后将”VimEmulator”这个选项的√去掉。如图…

    2026年2月1日
    6
  • 数据库选型之内存数据库eXtremeDB

    数据库选型之内存数据库eXtremeDB鉴于内存数据库访问速率快的特点,本文分别从单线程、多线程(并发访问)和多线程读/写混合访问角度对eXtremeDB数据库读写速率展开测试。需要指出的是,本文读取操作包含将数据读取后,并在控制台显示出来

    2022年7月2日
    45
  • C#生成Excel出现8000401a的错误的另一种解决办法。「建议收藏」

    C#生成Excel出现8000401a的错误的另一种解决办法。「建议收藏」网上能搜到的解决办法,常见的就是以下3种,比如参考这个博客https://www.cnblogs.com/gavindou/archive/2012/08/29/2661757.html1,增加虚拟权限:在web.config里面增加的键值;要求administrator具有管理员权限,这种方案使用后确实可行,可是不利于部署,因为有经验的人都知道把一个最高权限的服务器帐号密码公开显示在配置…

    2022年8月22日
    8
  • 大数据采集平台之ZDH_SERVER部署

    大数据采集平台之ZDH_SERVER部署目录项目源码下载源码打包部署运行项目源码数据采集平台管理端https://github.com/zhaoyachao/zdh_web数据采集平台服务https://github.com/zhaoyachao/zdh_serverweb端在线查看http://zycblog.cn:8081/login用户名:zyc密码:123456界面只是为了参考功能,底层的数据采集服务需要自己下载zdh_server部署,服务器资源有限,请手下留情如.

    2022年6月10日
    53

发表回复

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

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