Dplayer Blob对视频播放地址加密

写demo的时候遇到的问题,想要记录一下,正好也没有发表过文章所以想借此记录一下,内容有很多是查询资料获得的,毕竟我只是个萌新。

以下内容涉及到:Java 使用blob对H5视频播放进行加密
DplayerH5视频播放器
js中Blob转字符串

普通Mp4格式的视频

使用Blob将普通格式的视频加密并用Dplayer播放器进行播放比较简单。

Java后台将视频以文件流的形式传给前端

	@ResponseBody
    @RequestMapping("/getVideoSrc")
    public OutputStream getVideoSrc(HttpServletRequest httpServletRequest,
                                    HttpServletResponse httpServletResponse){
        //1.创建文件对象
        File f = new File("E:/test/1.mp4");
        //2.获取文件名称
        String fileName = f.getName();
        //3.导出文件
        String agent = httpServletRequest.getHeader("User-Agent").toUpperCase();
        InputStream fis = null;
        OutputStream os = null;
        try {
            //4.获取输入流
            fis = new BufferedInputStream(new FileInputStream(f.getPath()));
            byte[] buffer;
            buffer = new byte[fis.available()];
            fis.read(buffer);
            httpServletResponse.reset();
            //5.由于火狐和其他浏览器显示名称的方式不相同,需要进行不同的编码处理
            if(agent.indexOf("FIREFOX") != -1){//火狐浏览器
                httpServletResponse.addHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes("GB2312"),"ISO-8859-1"));
            }else{//其他浏览器
                httpServletResponse.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
            }
            //6.设置response编码
            httpServletResponse.setCharacterEncoding("UTF-8");
            httpServletResponse.addHeader("Content-Length", "" + f.length());
            //设置输出文件类型
            httpServletResponse.setContentType("video/mpeg4");
            //7.获取response输出流
            os = httpServletResponse.getOutputStream();
            os.flush();
            //8.输出文件
            os.write(buffer);
        }catch(Exception e){
            System.out.println(e.getMessage());
        } finally{
            //关闭流
            try {
                if(fis != null){ fis.close(); }

                if(os != null){ os.flush(); }

                if(os != null){os.close(); }

            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }

        return os;
    }

前端使用JavaScript将视频文件接收并转为Blob对象

	//创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
    //配置请求方式、请求地址以及是否同步
    xhr.open('POST', '/armystudy/blob/getVideoSrc', true);
    //设置请求结果类型为blob
    xhr.responseType = 'blob';
    //请求成功回调函数
    xhr.onload = function(e) {
        if (this.status == 200) {//请求成功
            //获取blob对象
            var blob = this.response;
            //获取blob对象地址,并把值赋给容器
            $("#sound").attr("src", URL.createObjectURL(blob));
        }
    };
    xhr.send();

html

<video id="sound" type="video/mp4" controls="controls" autoplay="autoplay"
       webkit-playsinline="true"    playsinline="true"   heigth="100%"></video>

文章来源:https://cloud.tencent.com/developer/article/1335832

使用Dplayer播放器

首先先要引用Dplayer的js文件

<script src="DPlayer.min.js"></script>
const dp = new DPlayer({
    container: document.getElementById('dplayer'),
    screenshot: true,
    video: {
        url: 'demo.mp4',
        pic: 'demo.jpg',
        thumbnails: 'thumbnails.jpg',
    },
    subtitle: {
        url: 'webvtt.vtt',
    },
    danmaku: {
        id: 'demo',
        api: 'https://api.prprpr.me/dplayer/',
    },
});

将Blob和使用Dplayer播放视频进行整合

java后台不用变,只需要将js内容进行合并

//创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
    //配置请求方式、请求地址以及是否同步
    xhr.open('GET', '/test03', true);
    console.log("请求")
    //设置请求结果类型为blob
    xhr.responseType = 'blob';

    xhr.onload = function(e){
        if (this.status == 200 ){
            //获取blob对象
            var blob = this.response;
            var dp = new DPlayer({
                 container: document.getElementById('dplayer'),//播放器容器元素
                 theme: '#FADFA3', //控件的颜色
                 loop: false,//视频循环播放
                    screenshot: true,//开启截图,如果开启,视频和视频封面需要允许跨域
                    hotkey: true,//开启热键,支持快进、快退、音量控制、播放暂停
                    lang: 'zh-cn',//可选值: 'en', 'zh-cn', 'zh-tw'
                    volume: 0.7,//默认音量,请注意播放器会记忆用户设置,用户手动设置音量后默认音量即失效
                    video: {
                        url: URL.createObjectURL(blob),//视频链接
                        pic: '',//封面
                        type: 'hls',//'auto'可选值: 'auto', 'hls', 'flv', 'dash', 'webtorrent', 'normal' 或其他自定义类型
                    }
                });
        }
    }
    xhr.send();

使用Blob加密.m3u8类型的流媒体文件

这个方面内容我查了很久的资料都没有相关的内容,在使用dplayer播放器情况下如果按照上面的那个方案使用blob将.m3u8文件进行加密,会出现一个问题:前端在请求.ts切片文件的时候的请求地址的前面会加上blob:导致请求错误404,然后我一直陷入一个误区:为什么非要将.m3u8文件使用Blob进行加密隐藏。 可以将请求.m3u8的地址进行隐藏,这样可以达到一样的目的,这是我的一个思路,如果大家有更好的思路可以评论出来,让我学习一下。

将Bolb文件转成字符串

var reader = new FileReader();
  reader.onload = function(event){
    var content = reader.result;//内容就在这里
  };
  reader.readAsText(blob);

将上面的内容整合一下就可以实现使用blob隐藏.m3u8的地址,达到和使用blob隐藏普通视频格式一样的效果。

//创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
    //配置请求方式、请求地址以及是否同步
    xhr.open('GET', '/test03', true);
    console.log("请求")
    //设置请求结果类型为blob
    xhr.responseType = 'blob';

    xhr.onload = function(e){
        if (this.status == 200 ){
            //获取blob对象
            var blob = this.response;

            var reader = new FileReader();
            reader.onload = function (event) {
                var content = reader.result;//获取Blob的内容
                var dp = new DPlayer({
                    container: document.getElementById('dplayer'),//播放器容器元素
                    theme: '#FADFA3', //控件的颜色
                    loop: false,//视频循环播放
                    screenshot: true,//开启截图,如果开启,视频和视频封面需要允许跨域
                    hotkey: true,//开启热键,支持快进、快退、音量控制、播放暂停
                    lang: 'zh-cn',//可选值: 'en', 'zh-cn', 'zh-tw'
                    volume: 0.7,//默认音量,请注意播放器会记忆用户设置,用户手动设置音量后默认音量即失效
                    video: {
                        url: content,//视频链接
                        pic: '',//封面
                        type: 'hls',//'auto'可选值: 'auto', 'hls', 'flv', 'dash', 'webtorrent', 'normal' 或其他自定义类型
                    }
                });
               
            }
            reader.readAsText(blob);
        }
    }
    xhr.send();
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值