正在读取数据,页面载入中,请稍后...

视频地址加密的方法,利用blob加密视频地址

怎样做视频播放地址加密,其实非常简单,我们观看视频网站的时候,发现video标签中的src属性值为blob:http,并不是真实的视频链接地址。使用Blob对象隐藏真实的资源路径,音频,视频,图片,都可以使用其Blob二进制数据流传输,在一定程度上可以起数据的加密作用,废话不多说,直接上代码吧。

教程开始

①、在网站根目录,新建一个 index.php 文件,代码如下;

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Blob Url</title>
</head>
<body>
<video id="video" width="400" controls="controls"></video>
<script type="text/javascript">
    //创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
    //配置请求方式、请求地址以及是否同步
    xhr.open('POST', 'blob.php', true);
    //设置请求结果类型为blob
    xhr.responseType = 'blob';
    //请求成功回调函数
    xhr.onload = function(e) {
        if (this.status == 200) {//请求成功
            //获取blob对象
            var blob = this.response;
            //获取blob对象地址,并把值赋给容器
            document.getElementById("video").src = URL.createObjectURL(blob);
        }
    };
    xhr.send();
</script>
</body>
</html>

②、在网站根目录,新建一个 blob.php 文件,代码如下;

<?php
// 返回二进制流数据
$file_path = 'video.mp4';// 文件地址
//$file_path = 'G:/phpstudy_pro/aaaaaaa49.com/video.mp4';// 文件地址
$file_size = filesize($file_path);// 文件大小

/*建议使用 file_get_contents() 读取文件内容,性能比 fread() 好*/
//$oct_data = fread(fopen($file_path, "r"), $file_size);// 读取文件内容
$oct_data = file_get_contents($file_path);// 读取文件内容

// 输出
header("Content-type: video/mpeg4;charset=UTF-8");
header("Content-Length: " . $file_size);
echo $oct_data;

③、在网站根目录,将视频命名为 video.mp4 文件名。

完成,对的,没错,两个文件就行了,代码就是这么简单,就这样就可以使用blob:http隐藏视频链接了。

想用框架

想用框架,想用解析,想给视频加载前,来个页面预加载,这个都不是什么难事,直接修改index.php的代码如下。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Blob Url</title>
</head>
<body>
<style type="text/css">
#preloader{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;z-index:9999;display:flex;justify-content:center;align-items:center}
#loader{width:20px;height:20px;border:3px solid #f7a7a7;border-top-color:#1068ec;border-radius:50%;animation:spin 1s infinite linear;display:flex;justify-content:center;align-items:center}#loader span{font-size:16px;font-weight:bold}
@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
</style>
<div id="preloader">
  <div id="loader"></div>
</div>
<iframe id="video" scrolling="no" allowtransparency="true" frameborder="0" style="width:100%;height:100%;frameborder:0;position:absolute;top:0;left:0;"></iframe>
<script type="text/javascript">
//创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
//配置请求方式、请求地址以及是否同步
xhr.open('POST', 'blob.php', true);
//设置请求结果类型为blob
xhr.responseType = 'blob';
//请求成功回调函数
xhr.onload = function(e) {
    if (this.status == 200) {//请求成功
        //获取blob对象
        var blob = this.response;
        // 加载iframe框架
setTimeout(function() {
//获取blob对象地址,并把值赋给容器
        document.getElementById("video").src = '/bili/?url='+URL.createObjectURL(blob)+'';
//隐藏加载页面
var preloader = document.getElementById('preloader').style.display = 'none';
}, 5000); // 延迟5秒加载iframe框架
    }
};
xhr.send();
</script>
</body>
</html>

这样就完成了,使用iframe全屏播放,使用视频解析播放,还给播放前加了个预加载特效,哎,试试看吧,我敢肯定,你的服务器带不动的。

代码短板

大多数的视频网站,都是使用blob:http隐藏链接,但是,这个blob:http加密链接,非常的短板,换句话就是说,需要强大的服务器配置,以及服务器大宽带支持才能用。这也就是为什么小网站,都不使用Blob的原因,如果你,不撞南墙不回头,不到黄河心不死,非常的执着,你可以测试一下就会发现,这代码一般站长都是用不起的。

这段代码,小千亲测,自己的8H8G10M表示带不动,另一台16H16G50M的还算勉强,但是打开属实缓慢,这种是先下载后输出的,本地测试可以播放,但线上播放就加载不出来,不是代码错误,而是下载视频需要时间,把整个视频文件下载完成后再读取,从而导致读取播放缓慢,这个算是Blob加密的代码短板,不是物理机和百兆宽带表示用不起。

本文结束

评论专区

发表评论

评论列表(无评论)