从 0 打造音视频直播系统
李超
前新东方音视频直播技术专家,前沪江音视频架构师
32579 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
WebRTC 1对1通话 (23讲)
从 0 打造音视频直播系统
15
15
1.0x
00:00/00:00
登录|注册

04 | 可以把采集到的音视频数据录制下来吗?

对CPU、内存、硬盘的要求高
录制失败率高
所录制的视频清晰度高
方便录制方操控
实现的复杂度很高
不会因录制时抢占资源而导致其他应用出现问题
不用担心客户因自身电脑问题造成录制失败
录制功能
缺点
优点
缺点
优点
下载录制好的文件
回放录制文件
录制音视频流
Blob
ArrayBufferView
ArrayBuffer
启动录制后多久可以回放
录制下来的音视频流如何播放
录制后音视频流的存储格式
音视频采集
客户端录制
服务端录制
思考时间
小结
如何录制本地音视频
基础知识
基本原理
WebRTC处理过程中的位置
可以把采集到的音视频数据录制下来吗?

该思维导图由 AI 生成,仅供参考

在音视频会议、在线教育等系统中,录制是一个特别重要的功能。尤其是在线教育系统,基本上每一节课都要录制下来,以便学生可以随时回顾之前学习的内容。
实现录制功能有很多方式,一般分为服务端录制客户端录制,具体使用哪种方式还要结合你自己的业务特点来选择。
服务端录制:优点是不用担心客户因自身电脑问题造成录制失败(如磁盘空间不足),也不会因录制时抢占资源(CPU 占用率过高)而导致其他应用出现问题等;缺点是实现的复杂度很高。不过由于本文要重点讲解的是接下来的客户端录制,所以这里我就不再深入展开讲解了,你只需要知道有服务端录制这回事就行了,或者如果你感兴趣,也可以自行搜索学习。
客户端录制:优点是方便录制方(如老师)操控,并且所录制的视频清晰度高,实现相对简单。这里可以和服务端录制做个对比,一般客户端摄像头的分辨率都非常高的(如 1280x720),所以客户端录制可以录制出非常清晰的视频;但服务端录制要做到这点就很困难了,本地高清的视频在上传服务端时由于网络带宽不足,视频的分辨率很有可能会被自动缩小到了 640x360,这就导致用户回看时视频特别模糊,用户体验差。不过客户端录制也有很明显的缺点,其中最主要的缺点就是录制失败率高。因为客户端在进行录制时会开启第二路编码器,这样会特别耗 CPU。而 CPU 占用过高后,就很容易造成应用程序卡死。除此之外,它对内存、硬盘的要求也特别高。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
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-23
    6
  • 耳东
    React版示例代码: https://github.com/baayso/react-tic-tac-toe/commits/master/src/components/Video/Video.js

    作者回复: 给你个大大的赞!

    2019-07-23
    5
  • 恋着歌
    交作业 https://codepen.io/htkar/pen/OKMbzV

    作者回复: 不错! 不错!

    2019-07-24
    3
  • 小樱桃
    在浏览器里使用了录制,录制本地视频是正常的,可是录制远程视频却只录制了声音,视频只有一帧静态图不知道为什么😣希望老师看到能解答一下

    作者回复: 每个recoder 只能录制一路视频,你需要用两个recoder 分别录制,之后用ffmpeg 合成

    2021-04-23
    2
  • 老猴
    录下来的数据推到了buffer中,这个buffer有什么限制?最大能录多大数据量的数据?时间长了,会不会出现异常,或者让浏览器甚至机器变慢的问题?

    作者回复: 这个没有明确说明,时间长了一定会有影响。但在启动录制时可以设置一个参数。在例子中我设置的是10ms。到达后就会触发事件,然后你就可以将录制的数据保存起来了。mediaRecorder.start(10)中参数含义如下:“开始录制媒体,这个方法调用时可以通过给timeslice参数设置一个毫秒值,如果设置这个毫秒值,那么录制的媒体会按照你设置的值进行分割成一个个单独的区块, 而不是以默认的方式录制一个非常大的整块内容.”

    2020-11-19
    2
  • hao11111205
    老师,在谷歌浏览器点击下载,不出现保存窗口,直接下载。这是为什么?

    作者回复: 如果你之前在浏览器中有设置保存文件的默认路径就会这样子

    2019-08-01
    2
  • 李跃爱学习
    从产品的角度来讲, 应该是设置保存路径,开始录制,结束录制这么操作。 但是看老师介绍的是要点击保存,就将当前blob的内容保存下来, 真实场景中,要录制很长时间,内存肯定是放不下吧,所以有点困惑,录制开始后是写到磁盘了,还是保存在内存中呢?

    作者回复: 我看一下 handleDataAvailable 这个函数,在这个函数中我是直接将它保存到内存中了。如果你想保存成文,可以直接在这里修改代码!

    2019-07-23
    2
  • 剑衣清风
    github 里的代码可以运行么? 关于这讲,推荐看看这个 https://cloud.tencent.com/developer/article/1366886 里的MediaRecorder使用示例 - 摄像头版,或者直接打开 https://wendychengc.github.io/media-recorder-video-canvas/cameracanvas.html,看看源文件的相关代码即可。

    作者回复: 可以运行,你再试一下

    2019-07-23
    1
  • lvxus
    老师,想请问一下录制桌面具体是什么操作

    作者回复: 后面的课程有讲,别着急!

    2019-07-23
    1
  • caidy
    假如多人实时直播,可以把多路视频保存到一个MP4文件用,那这个视频要怎么合并呢?假如每一路都是10分钟,要怎么让合并的视频也是10分钟呢?音频可以混音,那么视频呢?

    作者回复: 直播的时候不会把多路视频保存成mp4 文件的

    2021-04-14
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部