关于MediaRecorder的使用
本篇主要做一个相关文档的记录,以及canvas录制的示例 |
简介
由于我的业务场景是进行canvas的录制,所以并没有写音视频的DEMO,但是原理是一致的,都是如何捕获媒体流。
关键文档
Blob 的使用
https://developer.mozilla.org/zh-CN/docs/Web/API/Blob
https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/captureStream
如何获取系统摄像头和麦克风
https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
如何录制
https://developer.mozilla.org/zh-CN/docs/Web/API/MediaRecorder/MediaRecorder
https://github.com/yusitnikov/fix-webm-duration
关键步骤
捕获canvas流
1 2 3
| let stream = canvas.captureStream(120) let mediaRecorder = new MediaRecorder(stream)
|
监听文件流
1 2 3
| mediaRecorder.ondataavailable = function (e) { chunks.push(e.data); }
|
生成Blob文件
1 2
| var blob = new Blob(chunks, { 'type': 'video/webm\;codecs=h264' }); video.src = URL.createObjectURL(blob);
|
下载
1 2 3 4 5 6 7 8 9 10 11 12 13
| if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, filename); } else { const link = document.createElement('a'); const body = document.querySelector('body'); link.href = window.URL.createObjectURL(blob); link.download = filename; link.style.display = 'none'; body.appendChild(link); link.click(); body.removeChild(link); window.URL.revokeObjectURL(link.href); }
|
DEMO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| let recordBtn = document.getElementById('ELLA_RECORD') if (recordBtn) { let canvas = document.querySelector('canvas'); let chunks = []; let starttime = 0; let mediaRecorder = new MediaRecorder(canvas.captureStream(120)) mediaRecorder.onstop = function (e) { console.log("recorder stopped"); let filename = `EBR${new Date().getTime()}.webm` let duration = Date.now() - starttime; let blob = new Blob(chunks, { 'type': 'video/webm' }); chunks = []; webmFix(blob, duration, fixedBlob => { if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(fixedBlob, filename); } else { const link = document.createElement('a'); const body = document.querySelector('body'); link.href = window.URL.createObjectURL(fixedBlob); link.download = filename; link.style.display = 'none'; body.appendChild(link); link.click(); body.removeChild(link); window.URL.revokeObjectURL(link.href);
} }) } mediaRecorder.ondataavailable = function (e) { chunks.push(e.data); } recordBtn.onclick = function () { if (mediaRecorder.state === 'inactive') { starttime = Date.now() mediaRecorder.start(); recordBtn.innerHTML = '录制中' recordBtn.style.background = "red"; recordBtn.style.color = "black"; console.log(mediaRecorder.state); } else { mediaRecorder.stop(); recordBtn.innerHTML = '录制' console.log(mediaRecorder.state); recordBtn.style.background = ""; recordBtn.style.color = ""; } } }
|