04 | 可以把采集到的音视频数据录制下来吗?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了在音视频会议、在线教育等系统中实现录制音视频数据的重要性和方式。首先讨论了服务端录制和客户端录制的优缺点,重点讲解了客户端录制的实现方式。随后,文章讨论了录制的基本原理,包括存储格式、播放方式和回放时间等问题。在讲解存储格式时,文章提到了录制原始数据和录制成多媒体格式的优缺点,并详细分析了FLV格式的适用性和局限性。接着,文章指出了WebRTC的优势,解决了音视频保存、网络丢包和数据乱序等问题。最后,文章介绍了在学习如何使用WebRTC实现客户端录制之前需要了解的基础知识,包括ArrayBuffer、ArrayBufferView和Blob等二进制数据类型的关系。整体而言,本文深入浅出地介绍了音视频数据录制的重要性、实现方式和相关技术知识,对于从事音视频系统开发或相关领域的技术人员具有一定的参考价值。文章还介绍了如何使用浏览器中的MediaRecorder对象来录制本地或远程音视频流,并提供了相关代码示例。同时,文章也提出了在实际项目中需要考虑多路音视频流录制和回放的复杂情况,引发读者思考。
《从 0 打造音视频直播系统》,新⼈⾸单¥59
全部留言(26)
- 最新
- 精选
- xiao豪示例代码 var buffer; // 创建录制对象 var mediaRecorder; // 当该函数被触发后,将数据压入到 blob 中 function handleDataAvailable(e){ if(e && e.data && e.data.size > 0){ buffer.push(e.data); } } function startRecord(){ // 防止多次启动报错 if(mediaRecorder && mediaRecorder.state === "recording"){ return; } buffer = []; // 设置录制下来的多媒体格式 var options = { mimeType: 'video/webm;codecs=vp8' } // 判断浏览器是否支持录制 if(!MediaRecorder.isTypeSupported(options.mimeType)){ console.error(`${options.mimeType} is not supported!`); return; } try{ mediaRecorder = new MediaRecorder(videoplay.srcObject, options); }catch(e){ console.error('Failed to create MediaRecorder:', e); return; } // 当有音视频数据来了之后触发该事件 mediaRecorder.ondataavailable = handleDataAvailable; // 开始录制 mediaRecorder.start(10); } function startRecplay(){ console.log(mediaRecorder) var blob = new Blob(buffer, {type: 'video/webm'}); recvideo.src = window.URL.createObjectURL(blob); recvideo.srcObject = null; recvideo.controls = true; recvideo.play(); } function download(){ var blob = new Blob(buffer, {type: 'video/webm'}); var url = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.style.display = 'none'; a.download = 'aaa.webm'; a.click(); a.remove(); } function stop(){ if(mediaRecorder && (mediaRecorder.state === "recording" || mediaRecorder.state === "paused")){ mediaRecorder.stop(); } }
作者回复: 非常棒!
2019-07-236 - 耳东React版示例代码: https://github.com/baayso/react-tic-tac-toe/commits/master/src/components/Video/Video.js
作者回复: 给你个大大的赞!
2019-07-235 - 恋着歌交作业 https://codepen.io/htkar/pen/OKMbzV
作者回复: 不错! 不错!
2019-07-243 - 小樱桃在浏览器里使用了录制,录制本地视频是正常的,可是录制远程视频却只录制了声音,视频只有一帧静态图不知道为什么😣希望老师看到能解答一下
作者回复: 每个recoder 只能录制一路视频,你需要用两个recoder 分别录制,之后用ffmpeg 合成
2021-04-232 - 老猴录下来的数据推到了buffer中,这个buffer有什么限制?最大能录多大数据量的数据?时间长了,会不会出现异常,或者让浏览器甚至机器变慢的问题?
作者回复: 这个没有明确说明,时间长了一定会有影响。但在启动录制时可以设置一个参数。在例子中我设置的是10ms。到达后就会触发事件,然后你就可以将录制的数据保存起来了。mediaRecorder.start(10)中参数含义如下:“开始录制媒体,这个方法调用时可以通过给timeslice参数设置一个毫秒值,如果设置这个毫秒值,那么录制的媒体会按照你设置的值进行分割成一个个单独的区块, 而不是以默认的方式录制一个非常大的整块内容.”
2020-11-192 - hao11111205老师,在谷歌浏览器点击下载,不出现保存窗口,直接下载。这是为什么?
作者回复: 如果你之前在浏览器中有设置保存文件的默认路径就会这样子
2019-08-012 - 李跃爱学习从产品的角度来讲, 应该是设置保存路径,开始录制,结束录制这么操作。 但是看老师介绍的是要点击保存,就将当前blob的内容保存下来, 真实场景中,要录制很长时间,内存肯定是放不下吧,所以有点困惑,录制开始后是写到磁盘了,还是保存在内存中呢?
作者回复: 我看一下 handleDataAvailable 这个函数,在这个函数中我是直接将它保存到内存中了。如果你想保存成文,可以直接在这里修改代码!
2019-07-232 - 剑衣清风github 里的代码可以运行么? 关于这讲,推荐看看这个 https://cloud.tencent.com/developer/article/1366886 里的MediaRecorder使用示例 - 摄像头版,或者直接打开 https://wendychengc.github.io/media-recorder-video-canvas/cameracanvas.html,看看源文件的相关代码即可。
作者回复: 可以运行,你再试一下
2019-07-231 - lvxus老师,想请问一下录制桌面具体是什么操作
作者回复: 后面的课程有讲,别着急!
2019-07-231 - caidy假如多人实时直播,可以把多路视频保存到一个MP4文件用,那这个视频要怎么合并呢?假如每一路都是10分钟,要怎么让合并的视频也是10分钟呢?音频可以混音,那么视频呢?
作者回复: 直播的时候不会把多路视频保存成mp4 文件的
2021-04-14