【问题标题】:How can I add a delay before starting to record a MediaStream?如何在开始录制 MediaStream 之前添加延迟?
【发布时间】:2020-07-21 23:36:21
【问题描述】:

我正在尝试构建一个简单的屏幕录像机,并且在 MDN 文档的帮助下,我有以下两个功能:

window.onload = function startStream() {
    navigator.mediaDevices.getDisplayMedia({
        video: {
            cursor: "always"
        },
        audio: true
    }).then(stream => {
        preview.srcObject = stream;
        downloadButton.href = stream;
        preview.captureStream = preview.captureStream || preview.mozCaptureStream;
        return new Promise(resolve => preview.onplaying = resolve);
    }).then(() => startRecording(preview.captureStream())).then(recordedChunks => {
        let recordedBlob = new Blob(recordedChunks, {
            type: "video/webm"
        });
        recording.src = URL.createObjectURL(recordedBlob);
        downloadButton.href = recording.src;
        downloadButton.download = "RecordedVideo.webm";
    });
}

async function startRecording(stream) {
    let recorder = new MediaRecorder(stream);
    let data = [];

    recorder.ondataavailable = event => data.push(event.data);
    recorder.start();

    let stopped = new Promise((resolve, reject) => {
        recorder.onstop = resolve;
        recorder.onerror = event => reject(event.name);
    });
  
    let recorded = () => recorder.state == "recording" && recorder.stop();
    
    await Promise.all([stopped, recorded]);
    return data;
}

我想在数据开始记录之前添加一个延迟(比如 3 秒)。我尝试在不同的地方使用setTimeout(),但不断收到Cannot GET /[object%20MediaStream] 错误。任何帮助都会很棒!

【问题讨论】:

    标签: javascript screen-capture mediastream get-display-media


    【解决方案1】:

    Ciao,试着做这样的事情:

    function wait() {
       return new Promise(resolve => {
       setTimeout(() => {
       resolve();
     }, 3000);
    });
    }
    
    async function startRecording(stream) {
       let recorder = new MediaRecorder(stream);
       let data = [];
    
       recorder.ondataavailable = event => data.push(event.data);
       await wait(); 
       recorder.start();
    
       let stopped = new Promise((resolve, reject) => {
           recorder.onstop = resolve;
           recorder.onerror = event => reject(event.name);
       });
    
       let recorded = () => recorder.state == "recording" && recorder.stop();
    
       await Promise.all([stopped, recorded]);
       return data;
    }
    

    【讨论】:

    • 谢谢!! wait() 函数有效。这里还有一个更潮的版本:function wait() { return new Promise(resolve => setTimeout(resolve, 3000)); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2013-09-22
    相关资源
    最近更新 更多