1. 程式人生 > 其它 >利用RecordRTC錄製WebRTC中傳輸的媒體流

利用RecordRTC錄製WebRTC中傳輸的媒體流

技術標籤:WebRTCwebrtcseleniumjavascriptjava

一、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