前端工程记录:用RecordRTC实现对<video>标签的录像功能

这篇具有很好参考价值的文章主要介绍了前端工程记录:用RecordRTC实现对<video>标签的录像功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目需求:后端给一个mp4视频的链接,在前端播放,同时支持用户的录制视频操作。

一、技术选择

1. 毫无关系的getUserMedia

官方介绍文档:MediaDevices.getUserMedia() - Web API 接口参考 | MDN

在网上搜索“前端如何录像”,AI非常贴心地提供了这个函数,代码也写得有模有样,仔细一看发现和目的毫不相干,浏览器提供的 navigator.mediaDecives.getUserMedia() 是用来调用摄像头和麦克风的,与其相仿的 navigator.mediaDecives.getDisplayMedia() 则能够实现共享窗口和屏幕。

起初我想利用 navigator.mediaDecives.getDisplayMedia 对页面进行录制,但是在浏览器中,被共享的内容可以是浏览器的其他页面、正在使用的其他窗口、整个屏幕,唯独没有调用此函数的界面,遂放弃此想法。

2. rrweb

官网使用文档:https://github.com/rrweb-io/rrweb/blob/master/guide.zh_CN.md

这个库也是在网上看到的,用的人很多,然而不适用本工作场景,rrweb关注整个页面以及用户在页面上的各种操作,会记录页面DOM节点的变动,适合录制网课这类的场景,用来处理单独的video元素,有种杀鸡用牛刀的感觉。

3. recordrtc - canvas用法

github地址:https://github.com/muaz-khan/RecordRTC

recordrtc是基于webRTC的实现录屏的库,支持audio, video, canvas, gif四种类型。

具体使用流程如下(以普通html文件为例):

(1)引入

<script src="https://cdn.WebRTC-Experiment.com/RecordRTC.js"></script>
<script src="https://cdn.webrtc-experiment.com/screenshot.js"></script>

(2)创建对象

let element = document.getElementById('canvas');
let recordRTC = RecordRTC(element, {
    type: 'canvas'
});

(3)开始录制和结束录制

function start() {
    recordRTC.startRecording();
}
        
function stop() {            
    recordRTC.stopRecording(function(videoURL) {
        var a = document.createElement('a');
        a.href = videoURL;
        a.download = 'a.mp4';
        a.click();
    });
}

在结束录制函数stopRecording中,videoURL返回的是一个blob url,将其赋值给video元素的src,可以直接播放出录制的视频。本项目中需要下载录制视频,因此将videoURL赋值给新建的a标签,从而实现对录制视频的下载

(4)将video内容绘制到canvas上

let ctx = canvas.getContext('2d');
let video = document.getElementById('video');
video.addEventListener('play', function() {
    setInterval(() => {
        ctx.drawImage(content, 0, 0, 500, 300);
    }, 100);
}, false);

在type="canvas"的配置下,recordrtc会对canvas进行录制,而canvas不能直接包含video标签,所以为了录制视频,监听视频的播放操作,在play状态下将画面逐帧绘制到canvas上,我采用了setInterval,用requestAnimationFrame是同样的效果。

(5)html内容

<canvas id="elementToShare" width="500" height="300">
</canvas>

<video width="500" height="300" controls id="video" src="./test.mp4">
</video>

<div>
    <button onclick="start()">开始录制</button>
    <button onclick="stop()">结束录制</button>
</div>

以上代码能成功实现对video的录制,而且完全没有后期出现的录制视频卡顿的问题。但是,没声音。canvas只能录制画面,而我的需求是录制带声音的视频。

二、实际使用

1. 技术方案:recordrtc

在recordrtc的官方案例中,给出的是这样一个例子

let stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
let recorder = RecordRTC(stream, {
    type: 'video'
});

其中,RecordRTC接收的第一个参数是来自媒体设备传来的视频流。

我起初尝试仿照canvas,直接将video节点传入,然而不行,在type为video的情况下,RecordRTC接收的第一个参数必须是流。

在网上搜了半天,找到了一个函数captureStream,在浏览器上的兼容性一般,但是能够实现将获取video流的效果。

2. 代码

<template>
    <div v-if="isShow" :style="domStyle" >
        <div class="control-box>
            <Button v-show="!isRecording" @click="startRecord">录制</Button>
            <Button v-show="isRecording" @click="stopRecord">停止录制</Button>
        </div>
        <div class="video-box">
            <video controls ref="video">
            </video>
        </div>
        <a ref="link"></a>
    </div>
</template>

<script>
import RecordRTC from 'recordrtc';
export default {
    data() {
        return {
            isRecording: false,
            recordRTC: null,
        };
    },
    created() {
        // ...
    },
    mounted() {
        // ...
        this.initRecordRTC();
    },

    methods: {
        // 初始化recordRTC
        initRecordRTC() {
            this.recordRTC = null;
            let stream = null;
            const video = this.$refs.video;
            if (video.captureStream) { // 适用于chrome内核
                stream = video.captureStream();
            } else if (video.mozCaptureStream) { // 适用于firefox内核
                stream = video.mozCaptureStream();
            } else {
                this.$Message.warning('不支持captureStream,无法录制!');
                return;
            }
            this.recordRTC = RecordRTC(stream, {
                type: 'video'
            });
        },
        // 录制
        startRecord() {
            this.recordRTC.startRecording();
            this.isRecording = true;
        },
        // 停止录制
        stopRecord() {
            this.recordRTC.stopRecording((videoURL) => {
                let a = this.$refs.link;
                a.href = videoURL;
                a.download = 'test.mp4';
                a.click();
            });
            this.isRecording = false;
        },

    }
};
</script>

<style scoped>
.video-box {
    padding: 10px;
}
</style>

3. 细节问题

由于项目中的播放器支持用户改变文件路径,出现一个问题是,在修改video的src后,如果在播放视频前点击录制,项目会报一个错误,原因是在startRecording之前获取不到stream流。

解决方案是为recorder.startRecording加一个定时器,将上面的startRecord函数改成如下内容:文章来源地址https://www.toymoban.com/news/detail-813358.html

startRecord() {
    setTimeout(() => {
        this.recordRTC.startRecording();
        this.isRecording = true;
    }, 500);        
}

到了这里,关于前端工程记录:用RecordRTC实现对<video>标签的录像功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity实现摄像头录像功能

    在之前的很多展馆展示的项目中,甲方有很多要求实现用摄像头录像的功能。使用Unity实现调用USB摄像头画面的功能非常容易实现,但是实现录屏的功能有一些困难,我使用了几种方法都没有实现出想要的效果,后来我在网上找到一款叫做AVProMovieCapture的插件,实现了录屏的良

    2023年04月08日
    浏览(42)
  • vue实现调用手机拍照、录像功能

    目录 前言 准备工作 在这个示例中,我们将使用Vue.js框架来实现我们的目标。如果你还不熟悉Vue.js,推荐先学习一下Vue.js的基础知识。 接下来,我们需要创建一个基于Vue.js的项目。你可以使用Vue CLI来创建一个全新的Vue项目:# 安装Vue CLI # 创建一个全新的Vue项目 实现拍照功能

    2024年02月05日
    浏览(41)
  • java实现video标签视频流播放

    问题: 在遇到video标签播放后端视频源时问题。直接返回文件流的话 video需要将文件整个下载一次才会播放。这样如果小文件没有问题。如果文件大的话就比较恶心了。 解决方案:通过模拟video标签默认的range bytes规范方法分段获取视频信息。 video标签是通过请求头带上 Ran

    2024年02月14日
    浏览(58)
  • 【Android】使用 CameraX 实现基础录像功能

    目录 1. 基础开发环境 2. 添加相关依赖 3. APP 布局 4. 主流程逻辑 5. 调试或安装 APK 6. 项目完整代码 JDK:JDK17 Android Studio:Android Studio Giraffe | 2022.3.1 Android SDK:Android API 34 Gradle: gradle-8.0-bin.zip CameraX Version: 1.1.0-alpha05 在 build.gradle 中添加 CameraX 的相关依赖 在 AndroidManifest.xml 文件中

    2024年02月14日
    浏览(42)
  • Android4.4实现简单的录像功能

    一、前言 在Android中实现录像功能,高版本Android和低版本Android的API使用方式不同。本文以Android4.4系统为基础,简单的列举一下实现过程。 二、步骤 要在 Android 4.4 中实现录像功能,可按照以下步骤进行操作: 在布局文件中添加一个 SurfaceView 控件,作为预览画面的容器。 获

    2024年02月10日
    浏览(40)
  • 记录--多行标签超出展开折叠功能

     记录分享每一个日常开发项目中的实用小知识,不整那些虚头巴脑的框架理论与原理,之前分享过抽奖功能、签字功能等,有兴趣的可以看看本人以前的分享。  今天要分享的实用小知识是最近项目中遇到的标签相关的功能,我不知道叫啥,姑且称之为【多行标签展开隐藏

    2024年02月11日
    浏览(40)
  • 实现微信内置浏览器分享功能(前期准备+VUE前端部分代码+调试+坑记录)

    一、基础准备 1、登录微信公众号(需已认证),找到[【设置与开发】[【公众号设置】【功能设置】【js接口安全域名],在下面填写你的域名。 2、在【设置与开发】【基本配置】中拿到 appid开发者密码 appSecret ,给后端用生成签名时用到。 二、前端代码部分 1、下载微信sdk 2、

    2024年04月17日
    浏览(41)
  • 前端013_标签模块_新增功能

    点击 新增 按钮后,对话框形式弹出新增窗口 输入类别信息后,点击 确定 提交表单数据; 新增和修改功能共用一个组件,我们将它作为子组件引入到列表查询父组件中,下面先将组件定义出来。 弹出功能参考:https://element.eleme.cn/#/zh-CN/component/dialog#zi-ding-yi-nei-rong el-dialog标

    2024年02月04日
    浏览(42)
  • 实现html页面插入视频的自动播放、视频播放结束后的事件触发(video标签)

    要实现自动播放需要同时使用autoplay和muted属性,简单示例代码如下: html代码: css代码: 要实现视频播放结束后的事件触发需要使用addEventListener(“ended”, function () {})进行事件监听,简单示例代码如下: html代码: css代码: js代码: (1)菜鸟网址:https://www.runoob.com/tags/t

    2024年02月05日
    浏览(50)
  • 浏览器网页内嵌Qt-C++音视频播放器的实现,支持软硬解码,支持音频,支持录像截图,支持多路播放等,提供源码工程下载

        在浏览器中实现播放RTSP实时视频流,⼤体上有如下⼏个⽅案: ⽅案一:浏览器插件⽅案 ActiveX、NPAPI、PPAPI     ActiveX插件适用于IE浏览器,NPAPI与PPAPI插件适用于谷歌浏览器,不过这些插件都已经不被浏览器所支持。 ⽅案二:先转码再转流⽅案     ⼯作原理是架设一

    2024年01月17日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包