js录屏下载为mp4本地播放导出file

摘要:其实浏览器自身也是可以录制mp4的,只是很多人不知道,无从下手,特别是遇到相关需求的时候不知道怎么操作;下面是实战后总结的方法,直接拿取就可以使用。

封装录屏方法
export class ScreenRecording {
    mediaRecorder: MediaRecorder | null; // 录音对象
    stream: MediaStream | null; // 轨道对象
    chunks: any[]; // 录音缓存
    endCallback: any[]; // 录音结束回调
    constructor() {
        this.mediaRecorder = null;
        this.stream = null;
        this.chunks = [];
        this.endCallback = [];
    }
    create() { // 创建
        return new Promise((resolve, reject) => {
            this.resetState();
            navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }).then((stream) => {
                this.stream = stream;
                const mime = MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? "video/webm\;codecs=h264" : "video/webm";
                this.mediaRecorder = new MediaRecorder(stream, { mimeType: mime });
                resolve({code: 1, message: '创建成功'});
            }).catch((err) => {
                reject(err);
            });
        });
    }
    start() { // 开始
        return new Promise((resolve, reject) => {
            this.judgeMediaRecorderIs().then((mediaRecorder: MediaRecorder) => {
                // start(100); 每100毫秒生成一个数据可用事件
                mediaRecorder.start();
                // 完成一次录制片段后触发
                mediaRecorder.addEventListener('dataavailable', (e) => {
                    this.chunks.push(e.data);
                });
                resolve({code: 1, message: '开始录制'});
            }).catch((err) => {
                reject(err);
            });
        });
    }
    stop() { // 结束
        return new Promise((resolve, reject) => {
            this.judgeMediaRecorderIs().then((mediaRecorder: MediaRecorder) => {
                if (mediaRecorder.state === 'inactive') {
                    return reject({code: 0, message: '已结束'});
                };
                mediaRecorder.stop();
                this.stream.getTracks().forEach((track) => { track.stop(); });
                // 监听结束录制
                mediaRecorder.addEventListener('stop', (e: any) => {
                	resolve({code: 1, message:'录制结束'});
                    // 如果有录制结束回调的的话,执行回调
                    this.endCallback.forEach((callback) => {
                        callback();
                        this.endCallback.shift();
                    });
                });
            }).catch((err) => {
                reject(err);
            });
        });
    }
    download() { // 下载
        return new Promise((resolve, reject) => {
            this.handleChunksToBolb().then((blob: Blob) => {
                let url = URL.createObjectURL(blob);
                let a = document.createElement('a');
                a.href = url;
                a.download = MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? 'video.mp4' : 'video.webm';
                a.click();
                resolve(url);
            }).catch((err) => {
                reject(err);
            });
        });
    }
    viewRecording() { // 预览播放
        return new Promise((resolve, reject) => {
            this.handleChunksToBolb().then((blob: Blob) => {
                let url = URL.createObjectURL(blob);
                resolve(url);
            }).catch((err) => {
                reject(err);
            });
        });
    }
    toFile() { // 转file
        return new Promise((resolve, reject) => {
            this.handleChunksToBolb().then((blob: Blob) => {
                let filename = MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? 'video.mp4' : 'video.webm';
                let fileType = filename.includes('.mp4') ? 'video/mp4' : 'video/webm';
                resolve(new File([blob], filename, { type: fileType }));
            }).catch((err) => {
                reject(err);
            });
        });
    }
    handleChunksToBolb() { // 转bolb
        return new Promise((resolve, reject) => {
            this.judgeChunksIs().then((chunks: any) => {
                let blob = new Blob(chunks, { type: MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? 'video/mp4' : chunks[0].type })
                resolve(blob);
            }).catch((err) => {
                reject(err);
            });
        });
    }
    judgeChunksIs() { // 判断是否有录音缓存
        return new Promise((resolve, reject) => {
            let chunks = this.chunks;
            if (chunks.length === 0) {
                return reject({code: 0, message: '没有录制的缓冲'});
            };
            return resolve(chunks);
        });
    }
    judgeMediaRecorderIs() { // 判断是否创建了录制对象
        return new Promise((resolve, reject) => {
            let mediaRecorder = this.mediaRecorder;
            if (!mediaRecorder) { return reject({code: 0, message: '请先创建一个录制对象'}); };
            resolve(mediaRecorder);
        });
    }
    setEndCallback(callback) { // 存结束回调
        this.endCallback.push(callback);
    }
    resetState() { // 初始化状态
        this.chunks = [];
        this.mediaRecorder = null;
        this.stream = null;
    }
};
录屏方法使用
let myScreenRecording = new ScreenRecording();
/* @params res: {
    format: 'mp4',  type: String; value: 'mp4' | 'webm'; 说明:当前支持的录制格式;
} */
myScreenRecording.create().then((res: {format: 'mp4'}) => {
    // 开始录制
    myScreenRecording.start();
    // 因为录屏用户用户可能自己取消,而不是点击按钮取消所以新建一个回调函数作为监听
    let endRecording = () => {
        // 下载到本地
        myScreenRecording.download();
        // 本地播放url
        myScreenRecording.viewRecording().then((srcObject) => {});
        // 转file可上传到后台服务器
        myScreenRecording.toFile().then((file) => {});
    };
    // 存结束录音回调函数
    myScreenRecording.setEndCallback(endRecording);
});
// 手动结束录屏,then后才可以下载、获取本地播放url、转file对象
myScreenRecording.stop().then(() => {});
  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 若您需要一款无水印免费导出录屏软件Windows版,我推荐您尝试使用OBS Studio。 OBS Studio是一款功能强大且免费的录屏软件,它支持Windows系统,并且提供了无水印的导出功能。您可以通过以下步骤来使用该软件: 1. 首先,您需要下载和安装OBS Studio软件。您可以在官方网站(https://obsproject.com/)上找到适用于Windows系统的版本,并按照提示进行安装。 2. 安装完后,运行OBS Studio软件。在主界面中,您可以看到"Scenes"和"Sources"两个关键组件。 3. 在"Sources"中,您可以添加您想要录制的内容,例如屏幕、窗口、摄像头等。单击"+"图标,在弹出的菜单中选择适当的选项并进行设置。 4. 完设置后,您可以点击"开始录制"按钮开始录制屏幕内容。录制期间,您可以通过软件界面的控制按钮进行暂停、继续和停止录制操作。 5. 录制后,您可以进行文件导出。在软件界面中,选择"文件",然后选择"保存录像"。在弹出的保存窗口中,选择您想要保存录像的位置、文件名和格式。 6. 最后,点击"保存"按钮,OBS Studio将开始导出录制的内容。导出文件将不包含任何水印,可以直接分享或使用。 综上所述,OBS Studio是一款适用于Windows系统的免费录屏软件,具有无水印的导出功能。它易于使用且功能强大,可以满足您的录屏需求。希望这些信息对您有所帮助! ### 回答2: 有很多录屏软件都提供免费的Windows版本,并且没有水印。这些软件可以帮助用户轻松地录制屏幕上的活动,并且导出的视频没有任何品牌标志或水印。 一种常用的无水印免费录屏软件是OBS Studio。OBS Studio是一款功能强大且易于使用的开源录屏软件。它可用于录制屏幕,同时还提供了丰富的设置选项和专业级的视频编辑功能。用户可以根据自己的需要自定义录制导出设置,轻松地录制导出高质量的视频。 另一个无水印免费录屏软件是ShareX。ShareX是一款免费且功能强大的屏幕录制工具,它支持录制全屏、窗口、特定区域以及鼠标点击等。用户可以选择录制整个屏幕或特定区域,并且可以自定义录制导出的设置。ShareX还提供了丰富的后期编辑功能,可以对录制的视频进行剪辑、添加字幕、调整音频等。 除此之外,还有一些其他免费的录屏软件,如Bandicam、CamStudio等,它们同样提供无水印的录制导出功能,并且易于使用。 总之,无水印免费导出录屏软件有很多选择,用户可以根据自己的需求和喜好选择适合自己的软件。这些软件让用户能够轻松地录制导出高质量的视频,而不受到水印的干扰。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值