利用RecordRTC录制WebRTC中传输的媒体流

一、RecordRTC简介

参考https://blog.csdn.net/u014293306/article/details/81287026

  • RecordRTC:是一个为现代浏览器开发的基于javascript的媒体记录库(支持WebRTC的 getUserMedia API ),它为不同的设备和浏览器进行了优化,带来了全客户端(无插件)的媒体记录方案。
  • Recorder:通过RecordRTC的API生成的针对不同媒体类型的记录器,支持的媒体类型包括 MediaStreamRecorder (流媒体)、 StereoAudioRecorder(立体声) 、 WhammyRecorder 、 GifRecorder(gif动图),其他Recorder类型详见此页面
  • Stream:媒体的流对象,通过BOM的api navigator.mediaDevices.getUserMedia 可以获取,此对象在上述api的成功回调作为参数中传入。将此对象传入RecordRTC 的API可以生成Recorder对象,从而进行媒体记录。

二、录制步骤

2.1 安装RecordRTC

  1. 在项目文件夹中打开终端,输入:
npm install recordrtc

安装完成后,项目文件夹中出现

截屏2020-12-21_下午3_30_52
  1. 在recordrtc_demo.html文件中引入RecordRTC.js
<script src="node_modules/recordrtc/RecordRTC.js"></script>

2.2 录制

开始录制->停止录制->下载

1. 当页面中开始播放视频时,开始录制

function handleUserMedia(stream) {
    video.srcObject = stream;

    // recording
    recorder = RecordRTC(stream, {
        type: 'video'
    });
    recorder.startRecording();
}

2.按下stopbutton时,停止录制

document.getElementById("btn-stop-recording").onclick=function (){
    this.disabled = true;
    recorder.stopRecording(stopRecordingCallback);
}

function stopRecordingCallback() {
    video.src = video.srcObject = null;
    video.src = URL.createObjectURL(recorder.getBlob());
    // 下载
    createDownloadFile();
    recorder.stream.stop();
    recorder.destroy();
    recorder = null;
}

3. 下载至本地

由于文件是webm格式,因此加上.webm后缀。

function createDownloadFile(){
    var link=document.getElementById('download');
    link.download = "file.webm";
    link.href = URL.createObjectURL(recorder.getBlob());
    link.click();
}

三、demo

3.1 完整写法

demo由三部分组成:

  1. 负责页面显示的recordrtc_demo.html
  2. 负责媒体流播放、记录和下载的video_recording_simplified.js
  3. 负责自动化测试的test.java

recordrtc_demo.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>recordrtc_demo</title>
</head>
<div id="mainDiv">
    <h1><code>recordrtc()</code> very simple demo</h1>
    <h2>video_recording</h2>
<!--    <button id="btn-start-recording">Start Recoding</button>-->
    <button id="btn-stop-recording">Stop Recoding</button>
    <a id="download">Download</a>
    <hr>
    <video controls autoplay playsinline></video>
</div>
<script src="node_modules/recordrtc/RecordRTC.js"></script>
<script src="js/video_recording_simplified.js"></script>
</body>
</html>

video_recording_simplified.js

var video = document.querySelector("video");
var constraints = {video: true, audio: true};
var recorder;

navigator.mediaDevices.getUserMedia(constraints).then(handleUserMedia).catch(handleUserMediaError);

function stopRecordingCallback() {
    video.src = video.srcObject = null;
    video.src = URL.createObjectURL(recorder.getBlob());
    // 下载
    createDownloadFile();
    recorder.stream.stop();
    recorder.destroy();
    recorder = null;
}

function createDownloadFile(){
    var link=document.getElementById('download');
    link.download = "file.webm";
    link.href = URL.createObjectURL(recorder.getBlob());
    link.click();
}

function handleUserMedia(stream) {
    video.srcObject = stream;

    // recording
    recorder = RecordRTC(stream, {
        type: 'video'
    });
    recorder.startRecording();
}

function handleUserMediaError(error) {
    alert("Unable to capture your camera. Please check console logs.");
    console.log(error);
}

document.getElementById("btn-stop-recording").onclick=function (){
    this.disabled = true;
    recorder.stopRecording(stopRecordingCallback);
}

demo采用selenium运行,java代码如下:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.util.concurrent.TimeUnit;

public class test {
    public static void main(String[] args) throws InterruptedException {
        String htmlURL="file:html文件绝对路径";
        String FAKE_DEVICE = "--use-fake-device-for-media-stream";
        String FAKE_UI = "--use-fake-ui-for-media-stream";
        String FAKE_VIDEO = "--use-file-for-fake-video-capture=src/BOMBOMBOMBOM.y4m";
        String FAKE_AUDIO = "--use-file-for-fake-audio-capture=src/BOMBOMBOMBOM.wav";
        // 添加启动参数
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--no-sandbox");
        options.addArguments(FAKE_DEVICE);
        options.addArguments(FAKE_UI);
        options.addArguments(FAKE_VIDEO);
        options.addArguments(FAKE_AUDIO);
        // 启动Chrome
        WebDriver driver=new ChromeDriver(options);
        driver.get(htmlURL);
        TimeUnit.SECONDS.sleep(30);
        driver.findElement(By.id("btn-stop-recording")).click();
        TimeUnit.SECONDS.sleep(5);
        driver.quit();
    }
}

3.2 运行结果

截屏2020-12-21_下午3_59_09

播放file.webm显示如下,可根据需要转码至mp4等格式。

截屏2020-12-21_下午4_01_43
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个使用 Vue3、rrweb 和 WebRTC 技术进行录制和下载视频的示例代码: ```html <template> <div> <video ref="videoRef" autoplay></video> <button @click="startRecording">开始录制</button> <button @click="stopRecording">停止录制</button> <button @click="downloadRecording">下载录制</button> </div> </template> <script> import { ref } from 'vue' import RecordRTC from 'recordrtc' import { createSerializer } from 'rrweb/serializer' import { rrwebPlayer } from 'rrweb-player' import { createPeerConnection } from './webrtc' export default { setup() { const videoRef = ref(null) let recorder = null let mediaStream = null let recordedBlobs = null const startRecording = async () => { recordedBlobs = [] mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true }) videoRef.value.srcObject = mediaStream recorder = RecordRTC(mediaStream, { type: 'video', mimeType: 'video/webm', bitsPerSecond: 100000 }) recorder.startRecording() } const stopRecording = () => { recorder.stopRecording(() => { recordedBlobs = recorder.getBlob() const serializer = createSerializer() const events = serializer(events) const videoData = { events, width: videoRef.value.videoWidth, height: videoRef.value.videoHeight } createPeerConnection(videoData) }) mediaStream.getTracks().forEach(track => track.stop()) videoRef.value.srcObject = null } const downloadRecording = () => { const blob = new Blob(recordedBlobs, { type: 'video/webm' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.style.display = 'none' a.href = url a.download = 'recording.webm' document.body.appendChild(a) a.click() setTimeout(() => { document.body.removeChild(a) URL.revokeObjectURL(url) }, 100) } return { videoRef, startRecording, stopRecording, downloadRecording } } } </script> ``` 其,`createPeerConnection` 函数用于创建 WebRTC 连接并发送录制的视频数据,其代码如下: ```javascript import { createSignalChannel } from './signal' export const createPeerConnection = async videoData => { const rtcPeerConnection = new RTCPeerConnection() const signalChannel = await createSignalChannel() const offer = await rtcPeerConnection.createOffer() await rtcPeerConnection.setLocalDescription(offer) signalChannel.emit('offer', { offer, videoData }) signalChannel.on('answer', async ({ answer }) => { await rtcPeerConnection.setRemoteDescription(answer) }) } ``` 在这个函数,我们首先创建了一个 `RTCPeerConnection` 对象,然后使用 `createSignalChannel` 函数创建了一个信令通道,接着创建了一个 offer 并将其设置为本地的 SDP 值,最后通过信令通道将 offer 发送给对方。当对方接收到 offer 并创建了一个 answer 后,将其通过信令通道发送给我们,我们再将其设置为远程的 SDP 值即可建立 WebRTC 连接。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值