linux老版firefox支持mime,google-chrome - 在Firefox和Chrome通过MediaRecorder支持的所有MIME类型? - SO中文参考 - www.soins...

我发现了一个解决方案今天,其中包括使用var canRecordVp9 = MediaRecorder.isTypeSupported('video/webm;codecs=vp9');

铬(和Opera)和Firefox之间进行区分,然后做if (canRecordVp9)

{

mediaRecorder = new MediaRecorder(stream, {mimeType : 'video/webm;codecs=vp9'});

} else

{

mediaRecorder = new MediaRecorder(stream);

}

相应地构造MediaRecorder。

然后,抓住BLOB时:if (canRecordVp9)

{

blob = new Blob([myArrayBuffer], { "type" : "video/webm;codecs=vp9" });

} else

{

blob = new Blob([myArrayBuffer], { "type" : "video/webm" });

}

最后,使用的FileReader来获取BLOB作为dataUrl:`

var reader = new FileReader();

reader.onload = function(event)

{

var blobDataUrl = event.target.result;

}

reader.readAsDataURL(blob);`

我那么blobDataUrl保存为WebM档案,并记录在Chrome的视频在Firefox做工精细,反之亦然。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <style> /* styles.css */ body { font-family: Arial, sans-serif; margin: 0; padding: 0; background-color: #f2f2f2; } h1 { margin: 0; } main { max-width: 800px; margin: 20px auto; padding: 20px; background-color: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } #box { display: flex; flex-direction: column; align-items: center; } .buttons { margin-bottom: 20px; } button { padding: 10px 20px; margin-right: 10px; background-color: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; } .background-div { margin-bottom: 20px; } .background-btn { padding: 10px 20px; background-color: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; } .content { width: 80%; background-color: #f9f9f9; padding: 20px; } h2 { margin-top: 0; } #todo-form { display: flex; justify-content: center; align-items: center; margin-bottom: 10px; gap: 10px; } .input-field { padding: 10px; flex: 1; } .submit-btn { padding: 10px 20px; background-color: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; } .list { height: 400px; } .item { height: 40px; border-radius: 4px; line-height: 40px; padding: 8px; margin-bottom: 8px; background-color: #eee; } .item:hover { background-color: #ccc; } .hidden { display: none; } </style> <body> <main> <div class="buttons"> <button class="start-btn">开始录制</button> <button class="pause-btn">暂停录制</button> <button class="resume-btn">继续录制</button> <button class="stop-btn">结束录制</button> </div> <div id="box"> <section class="content"> <h2>TODO LIST</h2> <div class="background-div"> <button class="background-btn">切换背景颜色</button> </div> <div id="todo-form"> <input type="text" class="input-field" placeholder="输入待办事项" /> <button type="submit" class="submit-btn">提交</button> </div> <div class="list"></div> </section> </div> <img src="" alt="" class="hidden" /> </main> <script src="https://cdn.bootcdn.net/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script> <script> let col = 0; const colors = ['#ff708d', '#598bff', '#42aaff', '#ffc94d', '#2ce69b']; document.addEventListener('DOMContentLoaded', () => { document.querySelector('.background-btn').addEventListener('click', () => { document.querySelector('.content').style.background = colors[col]; col = (col + 1) % colors.length; canvasFunction(); }); document.querySelector('.input-field').addEventListener('input', event => { canvasFunction(); }); document.querySelector('.submit-btn').addEventListener('click', () => { const text = document.querySelector('.input-field').value; document.querySelector('.input-field').value = ''; const div = document.createElement('div'); div.setAttribute('class', 'item'); div.innerText = text; document.querySelector('.list').appendChild(div); canvasFunction(); }); const box = document.getElementById('box'); const boxBoundingClientRect = box.getBoundingClientRect(); const w = boxBoundingClientRect.width; const h = boxBoundingClientRect.height; const canvas = document.createElement('canvas'); canvas.setAttribute('id', 'canvas'); canvas.setAttribute('width', w); canvas.setAttribute('height', h); canvas.style.display = 'none'; box.appendChild(canvas); const img = document.querySelector('img'); const ctx = canvas.getContext('2d'); const allChunks = []; const stream = canvas.captureStream(60); // 60 FPS recording 1秒60帧 const recorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp9' }); recorder.ondataavailable = e => { allChunks.push(e.data); }; // 开始 document.querySelector('.start-btn').addEventListener('click', () => { if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) { canvasFunction(); console.log('开始'); recorder.start(10); } }); // 暂停 document.querySelector('.pause-btn').addEventListener('click', () => { console.log('暂停'); recorder.pause(); }); // 继续 document.querySelector('.resume-btn').addEventListener('click', () => { console.log('继续'); recorder.resume(); }); // 结束 document.querySelector('.stop-btn').addEventListener('click', () => { console.log('结束录制'); canvasFunction(); setTimeout(() => { console.log('保存'); recorder.stop(); debugger; const fullBlob = new Blob(allChunks); const videoUrl = window.URL.createObjectURL(fullBlob); const video = document.createElement('video'); video.controls = true; video.src = videoUrl; video.muted = true; video.autoplay = true; document.body.appendChild(video); }, 1000); }); const canvasFunction = () => { html2canvas(box, { useCORS: true }).then(canvas => { const imgStr = canvas.toDataURL('image/png'); img.src = imgStr; img.onload = function () { ctx.drawImage(img, 0, 0, w, h); }; }); }; }); </script> </body> </html>以上代码是根据html2canvas生成视频,但在录制结束时recorder.ondataavailable = e => { allChunks.push(e.data); };这个事件拿到的数据始终为0 ,如何解决?
08-15
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <style> /* styles.css */ body { font-family: Arial, sans-serif; margin: 0; padding: 0; background-color: #f2f2f2; } h1 { margin: 0; } main { max-width: 800px; margin: 20px auto; padding: 20px; background-color: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } #box { display: flex; flex-direction: column; align-items: center; } .buttons { margin-bottom: 20px; } button { padding: 10px 20px; margin-right: 10px; background-color: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; } .background-div { margin-bottom: 20px; } .background-btn { padding: 10px 20px; background-color: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; } .content { width: 80%; background-color: #f9f9f9; padding: 20px; } h2 { margin-top: 0; } #todo-form { display: flex; justify-content: center; align-items: center; margin-bottom: 10px; gap: 10px; } .input-field { padding: 10px; flex: 1; } .submit-btn { padding: 10px 20px; background-color: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; } .list { height: 400px; } .item { height: 40px; border-radius: 4px; line-height: 40px; padding: 8px; margin-bottom: 8px; background-color: #eee; } .item:hover { background-color: #ccc; } .hidden { display: none; } #myCanvas { /* display: none; */ } </style> <body> <main> <div class="buttons"> <button class="start-btn" id="start-btn">开始录制</button> <button class="pause-btn">暂停录制</button> <button class="resume-btn">继续录制</button> <button class="stop-btn" id="stop-btn">结束录制</button> </div> <div id="box"> <video width="100%" height="100" src="抖音-记录美好生活.mp4" autoplay controls></video> <section class="content"> <h2>TODO LIST</h2> <div class="background-div"> <button class="background-btn">切换背景颜色</button> </div> <div id="todo-form"> <input type="text" class="input-field" placeholder="输入待办事项" /> <button type="submit" class="submit-btn">提交</button> </div> <div class="list"></div> </section> <canvas id="myCanvas"></canvas> </div> <img src="" alt="" class="hidden" /> </main> <script src="https://cdn.bootcdn.net/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script> <script> // 假设我们有一个目标元素 #target 一个用于绘制的 canvas 元素 #myCanvas const target = document.getElementById('box'); const canvas = document.getElementById('myCanvas'); const startBtn = document.getElementById('start-btn'); const stopBtn = document.getElementById('stop-btn'); let mediaRecorder; let recordedChunks = []; let animationId; let stream; async function captureCanvas() { try { // 使用html2canvas捕获目标元素 const canvasElement = await html2canvas(target); const ctx = canvas.getContext('2d'); // 将捕获的内容绘制到canvas上 canvas.width = canvasElement.width; canvas.height = canvasElement.height; ctx.drawImage(canvasElement, 0, 0); } catch (error) { console.error('捕获失败:', error); } } // 开始录制 startBtn.addEventListener('click', async () => { recordedChunks = []; // 先绘制一次,确保canvas有内容 await captureCanvas(); // 获取canvas的媒体流,设置帧率(例如30fps) stream = canvas.captureStream(30); mediaRecorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp9' }); mediaRecorder.ondataavailable = event => { if (event.data.size > 0) { recordedChunks.push(event.data); } }; mediaRecorder.onstop = () => { // 合并数据并生成视频文件 const blob = new Blob(recordedChunks, { type: 'video/webm' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'recorded.webm'; a.click(); // 释放资源 stream.getTracks().forEach(track => track.stop()); URL.revokeObjectURL(url); }; mediaRecorder.start(); // 开始循环绘制,以保持视频流的持续生成 function updateCanvas() { captureCanvas().then(() => { animationId = requestAnimationFrame(updateCanvas); }); } updateCanvas(); }); // 停止录制 stopBtn.addEventListener('click', () => { mediaRecorder.stop(); cancelAnimationFrame(animationId); }); </script> </body> </html> 以上代码在html2canvas转视频是如何收录视频音频,请给出一个完整的案例
最新发布
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值