MediaRecorder录制流数据

本文详细介绍了如何使用WebRTC的MediaRecorder类来录制本地桌面数据,并将其保存为文件。通过示例代码展示了从获取媒体流到启动、暂停、停止录制以及播放和下载录制内容的完整流程。MediaRecorder提供了开始、停止、暂停和恢复录制的功能,并通过ondataavailable事件处理录制数据。
摘要由CSDN通过智能技术生成

一. 前言

        在这篇博客我们介绍了如何使用 WebRTC API 录制本地桌面数据并通过 HTML video 播放出来,现在我们想把采集到的本地桌面数据录制保存成文件并下载到本地,或者录制音视频设备采集到的数据,即可使用 MediaRecorder 类。

var mediaRecorder = new MediaRecorder(stream, options);

stream:表示媒体流参数,可以是从 getUserMedia 或者 getDisplayMedia 获取到的流参数对象。

options:表示限制选项,可以包含如下属性。

属性值说明
mimeType录制容器的类型,可以是 video/webm;codecs=h264,audio/webm;codecs=opus
audioBitsPerSecond音频码率
videoBitsPerSecond视频码率
bitsPerSecond整体码率

二. MediaRecorder

1. MediaRecorder 录制相关的函数

MediaRecorder.isTypeSupported()

说明:判断限制选项中设定的参数是否支持,例如可以设定 mimeType 为 video/webm;codecs=h264。

MediaRecorder.start(timeslice)

说明:开始录制,timeslice 为可选参数,如果设置了则会按时间切片存储数据。

MediaRecorder.stop()

说明:停止录制,调用 stop 后会触发 ondataavailable 事件。

MediaRecorder.pause()

说明:暂停录制。

MediaRecorder.resume()

说明:恢复录制。

2. MediaRecorder 事件

MediaRecorder.ondataavailable

说明:回调该事件函数表示存在有效数据了,通过回调事件函数参数的 data 属性可以获取到数据。如果 MediaRecorder.start 时指定了 timeslice,则会每个 timeslice 周期触发一次 ondataavailable 事件函数,如果没有指定 timeslice,则会在调用 stop 时回调 ondataavailable 事件函数。

MediaRecorder.onerror

说明:当错误发生时会回调该函数,录制会停止。

三. 实例演示

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>录制本地桌面</title>
    </head>
    <body>
        <table>
            <tr>
                <td><video autoplay playsinline id="video_player"></video></td>
                <td><video autoplay playsinline id="record_video_player"></video></td>
            </tr>
        </table>
        <button id="record">开始录制</button>
        <button id="play" disabled>播放</button>
        <button id="download" disabled>下载到本地</button>
        <script src="./js/record_desktop.js"></script>
    </body>
</html>
'use strict'

var videoPlayer = document.querySelector("video#video_player");
var recordVideoPlayer = document.querySelector("video#record_video_player");
var btRecord = document.querySelector("button#record");
var btPlay = document.querySelector("button#play");
var btDownload = document.querySelector("button#download");

var dataBuffer;
var mediaRecorder;

function HandleError(err) {
    console.log(err.name + "," + err.message);
}

function GetMediaStream(mediaStream) {
    videoPlayer.srcObject = mediaStream;
    window.stream = mediaStream;
}

function HandleDataAvailable(event) {
    if (event && event.data && event.data.size > 0) {
        dataBuffer.push(event.data);
    }
}

function StartRecord() {
    var options = {
        mimeType : 'video/webm;codecs=h264'
    };
    dataBuffer = [];

    if (!MediaRecorder.isTypeSupported(options.mimeType)) {
        console.error(`${options.mimeType} is not supported!`);
        return;
    }

    try {
        mediaRecorder = new MediaRecorder(window.stream, options);
    } catch (err) {
        console.error('Fail to new MediaRecorder!');
        return;
    }
    mediaRecorder.ondataavailable = HandleDataAvailable;
    mediaRecorder.start();
}

function StopRecord() {
    mediaRecorder.stop();
}

if (!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia) {
    console.log('getDisplayMedia is not supported!');
} else {
    var constraints = {
        video : {
            frameRate   : 24,
            width       : 640,
            height      : 480
        }
    };
    navigator.mediaDevices.getDisplayMedia(constraints)
        .then(GetMediaStream)
        .catch(HandleError);
}

btRecord.onclick = () => {
    if (btRecord.textContent === "开始录制") {
        StartRecord();
        btRecord.textContent = "结束录制";
        btPlay.disabled = true;
        btDownload.disabled = true;
    } else if (btRecord.textContent === "结束录制") {
        StopRecord();
        btRecord.textContent = "开始录制";
        btPlay.disabled = false;
        btDownload.disabled = false;
    }
}

btPlay.onclick = () => {
    var blob = new Blob(dataBuffer, {type : 'video/webm'});
    recordVideoPlayer.src = window.URL.createObjectURL(blob);
    recordVideoPlayer.srcObject = null;
    recordVideoPlayer.controls = true;
    recordVideoPlayer.play();
}

btDownload.onclick = () => {
    var blob = new Blob(dataBuffer, {type : 'video/webm'});
    var url = window.URL.createObjectURL(blob);
    var a = document.createElement('a');
    a.href = url;
    a.style.display = 'none';
    a.download = 'video.webm';
    a.click();
}

        运行后效果如下所示,首先选择希望共享的屏幕或窗口。

         点击开始录制按钮后即开始录制,之后可以点击停止录制按钮结束录制,再点击播放按钮即可播放录制期间采集到的桌面数据,点击下载到本地即可保存录制的桌面数据为文件到本地。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椛茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值