如何使用chrome.tabCapture.capture生成无损视频文件?

时间:2019-02-21 09:34:56

标签: google-chrome google-chrome-extension ffmpeg mediarecorder webm

问题描述:

chrome.tabCapture.capture将生成一个流,我使用MediaRecorder进行操作。 但是MediaRecorder仅支持webm视频格式。 Webm视频格式将压缩我录制的视频

如果我记录了选项卡页,但是10秒钟没有任何变化(包括没有鼠标移动,没有声音),则整个网页仍然静止。然后,最终的webm视频文件将只有一帧,甚至没有一秒钟。

有什么办法解决这个问题?因为我不想压缩视频

核心代码:

let mediaRecorder = '';

chrome.tabCapture.capture(captureConfig, stream => {
  if (stream === null) {
    chrome.tabs.sendMessage(id, {
      error: chrome.runtime.lastError
    });
    return false;
  }

  const recordedBlobs: BlobPart[] = [];
  mediaRecorder = new MediaRecorder(stream, {
    videoBitsPerSecond: 2500000,
    mimeType: 'video/webm;codecs=vp9'
  });

  mediaRecorder.ondataavailable = event => {
    if (event.data && event.data.size > 0) {
      recordedBlobs.push(event.data);
    }
  };

  mediaRecorder.onstop = () => {
    const superBuffer = new Blob(recordedBlobs, {
      type: 'video/webm'
    });

    const link = document.createElement('a');
    link.href = URL.createObjectURL(superBuffer);
    link.setAttribute('download', `${filename}.webm`);
    link.click();
  };

  mediaRecorder.start();
});

const stop = () => {
  mediaRecorder.stop();
  mediaRecorder.stream.getTracks().forEach(track => {
    track.stop();
  });
}

我正在使用铬,只要可以解决此问题,就可以用铬代替。 我也尝试过ffmpeg,但仍然不能,那些丢失的帧似乎无法恢复。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,添加了videoConstraints帮助。如果该解决方案对您不起作用,请告诉我,我会尽力解决这个问题。

P.S。 startStream是一个回调函数。

chrome.tabCapture.capture({
            audio: false,
            video: true,
            videoConstraints: {
                mandatory: {
                    chromeMediaSource: 'tab',
                    minWidth: 640,
                    maxWidth: 640,
                    minHeight: 420,
                    maxHeight: 420
                }
            }
        }, startStream )