使用HTML5中的Blob对象实现媒体播放功能

前言

图片、音频、视频等资源文件,我在之前的项目中都是采用,直接放到webContent路径下,然后在页面直接访问。这样就会存在一个安全性问题,就是无论什么用户或者游客,只要知道文件的URL就可以通过在浏览器地址栏输入URL直接获取到。
最近在浏览网站的时候,无意间接触到了Blob对象,经过研究终于可以实现从服务器其他路径(不在webContent路径下)获取文件,并进行显示或播放的功能了。其原理是,首先通过ajax请求,获取blob对象,在这个过程中就可以进行访问限制(例如,访问时检测用户是否登录等)。然后通过js获取blob对象的路径,然后赋给标签。

后台代码

后台代码和下载文件的代码是一样的,示例如下:

/*
 * 在这里可以进行权限验证等操作
 */

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

前端代码

Javascript代码:

//创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
//配置请求方式、请求地址以及是否同步
xhr.open('POST', './play', 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" width="200" controls="controls"></video>
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现录制视频并兼容所有浏览器,可以使用MediaRecorder API。这个API在现代浏览器得到支持,但在一些旧版本的浏览器可能不支持。为了让它兼容所有浏览器,可以使用一个polyfill库,比如`@webcomponents/webcomponentsjs`。 以下是实现录制视频并兼容所有浏览器的步骤: 1. 首先,在HTML创建一个`<video>`元素和一个`<button>`元素,用于开始和停止录制。 ``` <video id="video"></video> <button id="start">Start Recording</button> <button id="stop">Stop Recording</button> ``` 2. 在JavaScript使用`navigator.mediaDevices.getUserMedia()`方法获取用户的摄像头和麦克风权限,并将其流媒体传递给`<video>`元素。 ``` const video = document.getElementById('video'); navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(stream => { video.srcObject = stream; video.play(); }) .catch(error => { console.error(error); }); ``` 3. 创建一个`MediaRecorder`对象,将`<video>`元素的流媒体传递给它,并指定录制视频的格式和编码器。 ``` let mediaRecorder; const chunks = []; function startRecording() { mediaRecorder = new MediaRecorder(video.srcObject, { mimeType: 'video/webm; codecs=vp9' }); mediaRecorder.ondataavailable = event => { chunks.push(event.data); }; mediaRecorder.start(); } function stopRecording() { mediaRecorder.stop(); } ``` 4. 当用户点击“开始录制”按钮时,调用`startRecording()`函数开始录制;当用户点击“停止录制”按钮时,调用`stopRecording()`函数停止录制,并将录制的视频转换为Blob对象。 ``` document.getElementById('start').addEventListener('click', () => { startRecording(); }); document.getElementById('stop').addEventListener('click', () => { stopRecording(); const blob = new Blob(chunks, { type: 'video/webm' }); const videoURL = URL.createObjectURL(blob); // 将录制的视频显示在页面上 const recordedVideo = document.createElement('video'); recordedVideo.src = videoURL; document.body.appendChild(recordedVideo); }); ``` 5. 如果要兼容所有浏览器,可以在HTML添加一个`<script>`标签,引入`@webcomponents/webcomponentsjs`库。 ``` <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2.4.3/bundles/webcomponents-sd-ce.js"></script> ``` 这样就可以实现录制视频并兼容所有浏览器了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值