什么是“推流”?,第1张

拉流和推流的区别如下:

推流指的是把采集阶段封包好的内容传输到服务器的过程,而拉流是指服务器已有直播内容,用指定地址进行拉去的过程。

主流的推送协议和优缺点

RTMP

RTMP是Real Time Messaging Protocol(实时消息传输协议)的缩写,是Adobe公司为Flash/AIR平台和服务器之间音、视频及数据传输开发的实时消息传送协议。RTMP协议基于TCP,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。

HLS

Http Live Streaming是由Apple公司定义的基于HTTP的流媒体实时传输协议。它的原理是将整个流分为多个小的文件来下载,每次只下载若干个。服务器端会将最新的直播数据生成新的小文件,客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。

WebRTC

WebRTC(Web Real-Time Communication),即“源自网页即时通信”。WebRTC是一个支持浏览器进行实时语音、视频对话的开源协议。WebRTC的支持者甚多,Google、Mozilla、Opera推动其成为W3C推荐标准。

工程师职位描述与岗位职责

 在我们平凡的日常里,越来越多地方需要用到岗位职责,岗位职责是一个具象化的工作描述,可将其归类于不同职位类型范畴。我们该怎么制定岗位职责呢?以下是我精心整理的工程师职位描述与岗位职责,供大家参考借鉴,希望可以帮助到有需要的朋友。

工程师职位描述与岗位职责1

  工作职责

 1、负责商业变现相关系统的方案设计和实施;

 2、负责持续改善已有服务,优化系统薄弱点;

 3、完善基础组件支持,更好地支撑业务迭代;

 4、培养新人的编码、架构、解决问题的能力。

  任职要求

 1、3年以上工作经验,良好的算法与数据结构基础,扎实的编程能力,对服务端开发和网络服务有深刻的认识;

 2、熟悉Mysql。 Memcached。 Redis。消息队列,nginx等常用WEB组件,能按场景优化使用;

 3、有在线大流量服务设计和实现经验优先,有广告相关业务经验优先;

 4、有python或golang开发经验者优先。

工程师职位描述与岗位职责2

  职位描述

  岗位职责

 1、负责公司单片机、DSP、FPGA等嵌入式系统开发;

 2、负责制定嵌入式系统技术的整体方案;

 3、分析并解决产品在实际运行中出现的问题;

 4、独立负责产品硬件开发、调试、测试;

 5、总结项目产品研发经验,持续改进产品性能;

 6、有巡检车、AGV等开发经验者优先;

 7、认真做好公司领导交办的其它工作任务;

  任职要求

 1、本科5年或硕士3年以上嵌入式系统软硬件研发工作经验(精通嵌入式系统软件开发);

 2、有良好的分析和解决问题能力,逻辑思维清晰严谨;

 3、精通51/AVR/STM32等常见MCU,精通KEIl、IAR、CCS、AD;

 4、动手能力强、熟悉个各种驱动接口设计,如CAN、I2C,SPI,UART等;

 5、善于沟通,工作细心,责任心强,工作主动性强,具有较强的抗压及应变能力;

 6、具备团队管理能力;

工程师职位描述与岗位职责3

  工作职责

 1、负责广告风控与审核相关平台建设,推动公司相关业务接入

 2、参与搭建机器审核平台,支持每天千万级别广告素材审核,保障安全

 3、与各业务线配合推动风控策略,建立健全的风险防控机制与体系

  任职要求

 1、热爱编程,扎实的编程能力,良好的数据结构和算法功底

 2、精通python、php、c++、java、golang中的至少一门语言

 3、责任心强,积极主动,有良好的沟通能力和团队合作能力

 4、有很好的产品意识,对业务流程有良好的抽象和总结能力

工程师职位描述与岗位职责4

  岗位要求

 1、负责服务器产品BIOS/BMC开发过程的全流程管控。项目过程中输入输出交付件的进度管理和质量管理。

 2、负责BIOS/BMC版本生命周期管理,版本质量担当。

 3、根据项目范围、质量、时间与成本的综合因素的考虑,制定固件开发的总体计划与阶段计划,对于项目需求进行任务分解,并组织资源完成各项任务。

 4、负责定制项目组内外的沟通计划,保证固件团队与项目组各环节的目标明确,理解一致,沟通顺畅。

 5、负责组织服务器/存储产品生产过程及市场反馈的BIOS/BMC问题处理,进展跟踪反馈,问题复盘,跟踪改进措施落地。

 6、负责定期发出项目状态报告,对于项目风险需要及时评估,并积极准备相应的`应对措施。

  任职要求

 1、大学本科以上学历,有服务器行业或Linux软件项目管理经验优先。

 2、3年及以上实际软件开发经验,至少两年团队管理经验。

 3、有C语言相关技术背景。

 4、有较强的沟通协调能力。出色的时间管理、人力管理、风险管理、质量管理能力。以及良好的PPT制作和演讲能力。

 5、知识结构全面,并具有良好的快速学习能力和创新能力。能够主动学习新的业务领域知识,形成独立思考的和解决方案能力。

 6、有过CMMI经验和通过PMP考试的优先。

工程师职位描述与岗位职责5

  职位描述

 1、负责存储复杂方案(容灾,备份,存储虚拟化,数据迁移等方案)的现场交付、项目管理、项目培训工作,保障项目实施进度和实施质量。

 2、负责浪潮存储产品及方案方案技术支持工作。

 3、对典型方案、技术处理思路等进行总结、提炼并发布知识库。

  任职要求

 1、统招大学本科及以上学历,英语CET—4级,2年以上存储项目实施工作经验。

 2、熟悉常见的双机高可用软件如MSCS,RHCS,POWER HA等。

 3、对EMC,IBM,HDS高端存储熟悉者优先。

 4、具备良好的客户服务意识,沟通能力强。

工程师职位描述与岗位职责6

  职位描述

  岗位职责

 负责流媒体直播架构的设计和优化;

 负责流媒体服务端引擎的设计和优化;

  任职要求

 1、熟悉Linux C编程和服务端Lua编程;

 2、熟悉TCP/IP协议,掌握Socket编程;

 3、有nginx rtmp或srs服务开发经验或者服务端Lua开发经验;

 4、有openresty 网关相关的经验优先;

 5、较强的学习能力、接受新事物的能力,以及对技术的热情;

工程师职位描述与岗位职责7

  岗位职责

 1、负责美团点评风险评估及风险管理,并推动风险控制措施落地实施;

 2、负责美团点评的信息安全策略、制度、流程、指南的制定、编写、推动、运营、审计和优化;

 3、支持各类等保、合规、隐私保护、第三方认证、资质等需求的落地。

  岗位要求

 1、熟悉各类安全标准包括但不仅限于ISO2700x,PCI-DSS,NIST,FIPS 140-2,CSA,ITIL等;

 2、熟悉安全工程方法论和各种信息安全模型、架构、体系(P2DR、SDL、IT治理模型、风险管理模型、应急响应过程);

 3、具有良好的沟通协调能力、较强的团队合作精神、优秀的执行能力;

 4、有一定的安全技术背景,有贴近业务的一线安全管理或运营工作经验;

 5、良好的文档编写、展示以及跨部门沟通能力;

 6、有大型互联网ISMS经验者优先考虑。

工程师职位描述与岗位职责8

  岗位职责

 1、负责用友U9系统实施交付;

 2、根据业务部门的要求进行需求调研,与用户沟通并归纳用户需求;

 3、根据业务部门需求,结合U9产品功能,规划企业业务蓝图;

 4、负责培训业务部门的关键用户;

 5、负责系统功能测试及用户操作手册编写工作;

 6、负责在上线过程中,辅导业务部门业务人员熟练操作系统;

 7、负责业务部门的需求收集并拟出实施方案,并与公司研发人员一起提供解决方案。

  任职资格

 1、本科以上学历,财务、计算机、管理类相关专业背景,有2年以上项目实施经验;

 2、有一定的SQL、计算机网络及软件基础;

 3、有强烈的责任心,超强的执行力,良好的沟通及问题解决能力;

 4、能承受较强的工作压力,具备良好的团队协作能力;

 5、属性ERP各个模块的应用,对销售,采购,库存,生产,以及财务有更深的了解;

 6、熟悉用友U9软件者优先考虑。

工程师职位描述与岗位职责9

  职位描述

 1、参与公司内部系统研发,负责代码及相关模块的文档维护

 2、能够顺畅完成内部协作,并互相帮助提升

 3、能同项目经理、团队成员进行有效沟通

 4、负责功能模块的设计原型实现、解决系统运行过程中的疑难问题

 5、智能设备、物联网软件、微信连接方向

  职位需求:

 1、全日制统招本科以上学历,计算机相关专业,985,211,1年以上研发经验。

 2、做事积极主动,细心,有较强责任心和事业心,有团队精神。

 3、较强的编程能力,能够独立完成复杂的交互流程设计和实现,较强的文档理解能力。

 4、熟悉Net平台上的开发技术,精通Net/C#开发,熟悉SQL Server数据库,熟悉Sql语句优化及数据库优化。

 5、抗压力强;有专研精神; 结果导向。

 6、有互联网研发经验优先、熟悉酒店业务者优先。

  上班地点:

 上海市长宁区虹桥路2451号;

 员工福利:

 员工餐补、保险、公积金、提供住宿、周年礼物、周年体检、酒店住宿折扣、部门活动

工程师职位描述与岗位职责10

职责描述

 1负责客户端相关逻辑的脚本开发;

 2负责游戏客户端调优;

 3负责游戏客户端模块设计和开发。

  任职要求

 1 1年以上游戏客户端开发经验

 2 至少熟悉Python/lua一种脚本语言的优先考虑

 3 至少熟悉Unity3D/Unreal4一款引擎的优先考虑

 4 具有良好的编程能力、代码风格和编程习惯、熟练掌握常用数据结构及算法

 5 热爱游戏,能适应手游开发节奏者优先

工程师职位描述与岗位职责11

  工作职责

 1、负责字节跳动海内外业务线(包括头条、抖音、火山、TikTok等等)安全平台及产品的设计与研发;

 2、负责头条、抖音、火山、TikTok等产品的内部通用安全组件的服务端研发;

 3、开发和完善后台相关工具、系统和流程建设。

  任职要求

 1、有强烈的求知欲和进取心,追求极致的技术geek甚好;

 2、具有扎实的编程功底,良好的设计能力和编程习惯;

 3、熟练掌握Python/c/c++中的至少一种;

 4、熟悉Django、go语言开发、安全开发经验者优先。

工程师职位描述与岗位职责12

  工作职责

 1、负责字节跳动信息集成与共享平台的前端研发;

 2、负责高质量的设计和编码,承担重点、难点的技术攻坚;

 3、和产品经理配合,深度参与产品需求讨论,功能定义等;

 4、主要前端框架:React、Electron等。

  任职要求

 1、良好的设计和编码品味,热爱写代码,能产出高质量的设计和代码;

 2、追求极致和完美,有代码洁癖,善于总结和挖掘事物本质;

 3、掌握WEB前端开发技术:JavaScript(含ES6)、HTML、CSS、DOM、协议、安全等;

 4、较好的产品意识,愿意将产品效果做为工作最重要的驱动因素;

 5、有知名开源作品优先。

工程师职位描述与岗位职责13

  工作职责

 1、参与支持公司相关短视频以及相机类App的跨平台SDK相关功能研发;

 2、参与录制、视频编辑、特效处理、编解码等核心功能模块的研发;

 3、参与国内、海外市场适配和体验优化。

  任职要求

 1、至少熟悉Android or iOS一端音视频采集录制编辑流程;

 2、熟悉OpenGL、C/C++者优先,有跨平台开发经验者优先;

 3、对性能精益求精,有移动端CPU / GPU结合的性能优化经验者优先;

 4、有Camera优化经验者优先;

 5、有海外市场适配和优化经验者优先;

 6、熟悉FFMpeg、webrtc、GPUImage等开源多媒体框架者优先;

 7、对多媒体开发兴趣浓厚,学习和沟通能力者优先。

工程师职位描述与岗位职责14

  工作职责

 1、负责斗鱼主站后台需求开发;

 2、参与后台系统架构、性能、安全、扩展等优化的设计和实现;

 3、根据开发进度和任务分配,完成相应模块的文档及代码编写;

  任职资格

 1、1—5年linux服务器端软件开发经验;

 2、编程基本功扎实、熟悉常见的数据结构与算法、精通C/C++,熟悉面向对象技术,熟悉常见的设计模式;

 3、精通TCP/IP协议相关知识及网络编程;

 4、熟悉MySQL数据库,数据库设计、优化、调试、调优;

 5、良好的分析问题和解决问题的能力,有高并发Server设计开发经验优先。

工程师职位描述与岗位职责15

  工作职责

 1、负责存储、计算、云平台等基础平台的开发和维护,为海量数据和大规模业务系统提供易用的基础设施

 2、能够快速理解业务场景,推动平台化,并对公司内外的用户体验负责

 3、高水平小团队,紧密合作,高效工作,做有影响力的事情

  任职要求

 1、对存储、计算、消息队列、集群管理中的一项或多项有理解和认识

 2、追求优雅的设计和优秀的代码质量,高标准

 3、对问题敏锐,快速行动

 4、具备良好的责任心、较强的学习能力、优秀的团队沟通与协作能力

;

URL就是直播服务器的发布地址,流名称是流媒体直播系统提供的。

流媒体采用流式传输技术在网络上连续实时播放的媒体格式,如音频、视频或多媒体文件。

流媒体文件一般定义在bit层次结构,因此流数据包并不一定必须按照字节对齐,虽然通常的媒体文件都是按照这种字节对齐的方式打包的。流媒体的三大操作平台是微软公司、RealNetworks、苹果公司提供的。

扩展资料

实时流式传输指保证媒体信号带宽与网络连接匹配,使媒体可被实时观看到。实时流与HTTP流式传输不同,他需要专用的流媒体服务器与传输协议。

实时流式传输总是实时传送,特别适合现场事件,也支持随机访问,用户可快进或后退以观看前面或后面的内容。理论上,实时流一经播放就可不停止,但实际上,可能发生周期暂停。

实时流式传输必须配匹连接带宽,这意味着在以调制解调器速度连接时图象质量较差。而且,由于出错丢失的信息被忽略掉,网络拥挤或出现问题时,视频质量很差。如欲保证视频质量,顺序流式传输也许更好。

实时流式传输需要特定服务器,如:QuickTime Streaming Server、RealServer与Windows Media Server。这些服务器允许你对媒体发送进行更多级别的控制,因而系统设置、管理比标准HTTP服务器更复杂。

实时流式传输还需要特殊网络协议,如:RTSP (Realtime Streaming Protocol)或MMS (Microsoft Media Server)。这些协议在有防火墙时有时会出现问题,导致用户不能看到一些地点的实时内容。

—流媒体

总体来讲,音视频开发是有一定的技术门槛的,我觉得至少需要在这个领域踏踏实实积累个3-5年,才能对音视频相关的开发知识有一个整体、深刻的理解。

从技术上来讲,需要从如下两个大类知识点上去积累:

C/C++通用开发知识

音视频开发的主要编程语言就是C和C++。

这块的专业知识积累是通用的,并不局限于某个特定的行业,属于程序员的技术功底。

可以重点关注如下几个方面:

计算机系统的底层工作原理

操作系统原理

程序的编译、链接和加载机制

C/C++语言特性背后蕴含的思想,底层工作原理,适用场景,存在什么样的问题

软件设计原则和设计模式

数据结构和算法

多线程并发编程原理

网络编程

跨平台

操作系统API

软件调试

2 音视频领域专业知识

这块属于从事音视频行业的专业知识。

这块的专业知识是非常多的,每个功能模块背后涉及很多专业的知识。

音视频的开发可以分为两大块,涉及的内容大致如下:

音视频客户端开发

客户端应用开发

音视频引擎开发

音视频引擎SDK

音视频引擎框架

音视频引擎功能模块

音/视频采集

音/视频渲染

音/视频数据处理

音/视频编/解码

录制

串流

音视频同步

流媒体服务器开发

通用服务器开发知识,需要关注如下几个点

高稳定性

高性能

高并发

高可用

流媒体服务器开发

SFU vs MCU

流媒体协议转换

弱网下的音视频传输协议

录制 & 转码

上述内容中,客户端应用开发、音视频引擎SDK、音视频引擎框架、通用服务器开发等主要涉及C/C++通用开发知识,但要设计好这些部分必须对音视频相关的知识和产品业务有比较深刻的理解才能做到。通常,音视频架构师比较关注这些部分。

而音视频引擎底层功能模块和SFU/MCU流媒体服务器的开发,则和音视频的专业知识密切相关。

已经给大家准备好了安装环境和各种视频资料,资料放在自己的群里面:832218493(需要自取)

视频数据可以通过如下方式获得:

USB摄像头

专业的硬件视频采集卡(有软压卡和硬压卡之分)

网络摄像机(支持RTSP协议)

操作系统提供的屏幕录制API

读取音视频文件并解码

订阅流媒体服务器上的流

音频数据可以通过如下方式获得:

声卡

扬声器播放声音的回环采集(依赖操作系统的API)

读取音视频文件并解码

订阅流媒体服务器上的流

支持音频输入的网络摄像机(支持RTSP协议)

支持音频输入的视频采集卡

在手机上,操作系统的SDK会提供相关的音视频采集接口

音/视频渲染

视频渲染一般需要了解OpenGL,而音频渲染需要了解OpenAL

可以通过开源库SDL来快速实现渲染模块

在Windows下使用DirectShow框架,操作系统提供了对应的视频和音频渲染模块(通过GraphEdit可以看到)

在DirectShow中渲染器会涉及到音视频同步的策略,当然,也完全可以自己去实现音视频同步模块

音/视频数据处理

这些模块基本是在编码前或解码后,对视频或音频的原始数据进行某种算法上的处理

视频处理主要包括分辨率转换、色彩空间转换、帧率转换、图像增强、多路视频拼接、添加字幕、添加LOGO等,这块对整体的性能影响比较大,往往需要使用SIMD指令进行汇编优化或使用GPU算法进行加速

音频处理主要包括回声消除、噪声抑制、自动增益、混音等,这块往往会涉及比较多的信号处理和数学知识,是音频中比较复杂的一块

音/视频编/解码

视频编/解码

要理解视频的基本编码原理,熟悉视频编码的关键参数和码流格式

目前使用比较多的是H264,H265开始逐步在使用,其他的视频编码也有很多,如AVS、VP8、VP9等

视频编码对音视频引擎的性能影响比较大,这块基本都是需要使用GPU加速的,目前的Intel集显对H264和H265支持还是比较好的,NVIDIA的独立显卡在编码上存在路数的限制;手机上一般都有对应的硬件加速模块;在性能较好的硬件上,可以考虑开源的X264

音频编/解码

要理解音频的基本编码原理,熟悉音频的关键参数和码流格式

目前使用比较多的是AAC,其他的音频编码也有很多,如G711、G722、OPUS等

在PC上,一般音频的相关模块对性能的影响不明显,但在海思嵌入式系统上,音频模块对性能的影响就不能忽略,因为海思基本没有提供音频的硬件加速模块,而ARM CPU性能也有点弱

录制

需要理解FLV、MP4、TS等容器格式

对于特殊的录制方式要注意软件的处理方式,例如,加片头和片尾的录制功能,追加录制

MP4录制要注意moov box放在文件开始或结束对录制文件的写入和点播的影响

录制时音视频均匀混合的策略

串流

理解视频互动、直播和点播的工作原理

关键评价指标

延迟

首屏时间

同步

流畅性

画质/音质

理解下述的几种音视频传输协议

RTMP

HTTP + FLV / Websocket + FLV

HLS

RTP & RTCP

RTSP

SIP

WebRTC

H323

弱网下的音视频传输协议

理解TCP协议栈原理

可靠的UDP传输协议

KCP

SRT

QUIC

FEC + 丢包重传机制(如NACK)

音视频的开发并不是完全从零开始,而是有许多可以依赖的开源库,但要用好这些库,需要对上述的音视频专业知识有深刻的理解。

比较常见的音视频开源库,如下:

ffmpeg

可以直接使用ffmpeg的命令行实现转码、切片等常见功能

可以基于FFmpeg API封装开发自己的音视频模块

live555

比较完善的RTSP库

x264

比较常用的H264编码库

fdkaac

比较常用的AAC编解码库

librtmp

支持rtmp协议,产品化时需要自己进一步完善

pjsip

支持sip协议

webrtc

google开源的webrtc库,有比较好的音/视频引擎,对网络状态的实时评估可以借鉴,回声消除模块也是比较有名的

SDL

比较有名的音视频渲染库

SRS

国内比较知名的RTMP流媒体服务器,支持HLS、HTTP+FLV,40版本开始支持WebRTC

OWT

Intel开源的WebRTC套件,支持了WebRTC客户端SDK和分布式的WebRTC MCU服务器

OpenCV

著名的视频算法库

另外,视频的编码和解码可以基于Intel Media SDK和NVIDIA的NVENC来实现。

在海思嵌入式上,海思芯片(如Hi3531D等)提供了硬件的音视频采集、音视频渲染、视频编/解码、视频图像处理等核心功能,这就需要借助于海思提供的SDK进行开发了。

顺便给大家推荐一个学习音视频的学习大纲 需要自取:

C++Linux服务器音视频资料分享

QQ群名片

WebRTC ,名称源自 网页即时通信 (英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的 API。它于 2011 年 6 月 1 日开源并在 Google、Mozilla、Opera 支持下被纳入万维网联盟的 W3C 推荐标准。

首先,他即是 API 也是协议。

其次,他是浏览器进行音频与视频通话的 API,其实还有屏幕共享的功能。

最后,它现在已经处于 W3C 标准,各大浏览器厂商已经对他进行兼容了。

但是如果我们想使用好 webrtc,就得先了解 websocket。而对于 websocket,大家应该都比较熟悉了,比如社交聊天、多人 游戏 、协同编辑、视频会议、基于位置的应用(地图)、等等需要高实时的场景。我们比较常用的微信、QQ、某些直播软件等等也都是基于 websocket 实现消息与信令的转发。大家看到这里可能在信令这里迟疑了,接着看。

webrtc 是 P2P 的一种技术,什么是 P2P?其实就是 端对端,就说是你的音频、视频流不经过服务器中转,直接由一端发送到另一端。

不经过服务器中转,也就说时候,如果通过过程中服务器突然崩溃,是不是通话还能继续?

是的!但是发送音频视频流前,一定是需要建立 P2P 连接的,建立连接前一定需要服务器进行信令转发,这个信令就是通话两端的标识。

而如果想用 webrtc 实现通话,就得先中转信令、建立连接。而建立连接的话最好是要用 websocket 进行信令转发的。大家都知道,websocket 是个通道,在这个通道的所有端,都可以收到任意一端的消息流,包括发消息的本人。

为什么不经过服务器就可以直接获取到对方的视频音频流呢?是因为建立了 P2P 通道,这个 P2P 在中转信令的时候就已经通了,传输视频音频流的时候还要啥服务器啊。这个时候,肯定有小伙伴表示怀疑,音频视频流可以不通过服务器?是的,我骗了大家,确实要经过服务器,但是只是线上需要服务器转发,如果我们是本地两台或者多台同一局域网的端 进行 webrtc 音频视频流的转发,确实不需要中转服务器,但是线上有可能需要,也有可能不需要,这里又涉及到了一个 打洞 的概念。

我们平常可能会听到比较牛 x 的词汇,什么打洞、内网穿透、NAT 穿越,各种高大上的东西,其实也是蛮好理解的。大家都知道,两个不同网络下的两台主机不可以直接进行通信,而是需要走公网或者说各自的网关。打洞、内网穿透、NAT 穿越其实就是一个意思,就是使用 udp 让我们两台非同一网络的主机互联,不走公网,直接实现连接。有玩过花生壳的同学一定能理解内网穿透这个概念。

本地开发的话,两台主机连同一局域网,根本不需要内网穿透,就可以直接通信。

线上开发的话,如果能够 STUN 打洞成功,也不需要中转服务器。但是,有打洞不成功的概率,为什么呢,因为没有走公网,没有给运营商带来收益却带来通信成本,肯定要限制。国外打洞成功的概率在 70%,但是国内 50%都不到。

所以,为了防止打洞不成功的情况,我们使用 TURN 中转服务器 转发流媒体数据进行一个最后保障。此外还有一种方式为 逆向连接 ,也可以帮助我们实现 P2P 建立,他的原理是必须是一方走公网,也是有局限性的。

coturn 中继服务器由两部分组成 STUN 与 TURN,STUN 帮助我们打洞,TURN 帮助我们转发流媒体数据。

##连接过程

以下所有 API 截止到 20211206 为最新

##我有疑问

给大家看看 sdp 的本质,就是自身的媒体信息和编解码信息

一个 offer,一个 answer,我们彼此都知道对方的媒体信息与编解码信息,这样我们才能好好协商,我这边该用什么方式对你的视频音频流进行解码、渲染。

过程有些繁杂,具体流程小伙伴们可以看这篇文章 WebRTC TURN 协议初识及 turnserver 实践。

了解 webrtc 的音视频采集、桌面采集;

了解 websocket 和 webrtc 的整个链路建立过程;

实现 1V1 文字传输、视频通话、语音通话、屏幕共享;

实现视频通话、语音通话、屏幕共享过程中的截图、录音、录屏及 截图、录音、录屏的在线播放与下载;

将以上功能部署上线;

在这里,我们要对音视频建立过程画一个基本的流程图。

基本流程图

对于这些信令,我们使用 websocket 进行转发,这里大家会问,为什么不使用 http?

首先,我们的要实现的 demo 本来就含有发送普通文本消息的功能,就是使用 websocket。(长短轮询太老了,性能太差)

其次,第一点可以忽略,http 的请求会打回原路,A 向服务器请求,绝对不会传向 B。

但是如果我们要使用 websocket 转发信令,就要清楚的了解,在同一管道的所有端都会收到这条消息。所以,对于上面流程图来说,其实所有的小箭头都是双向的。

这时候,我们可以在 node 服务中来控制推送消息的方向,也可以在客户端来控制,这里我选择在 AB 端来控制。

其次,我们在本地开发,如果使用一台电脑,两个浏览器的形式,websocket 文字消息是可以的。但是音视频通话不行,因为不管是传输通道还是音视频设备(麦克、扬声器等)都是冲突的。所以,我们可以通过同一局域网,使用两台电脑解决这个问题。并且,因为 webrtc 的安全限制,必须使用 https(不管是线上还是本地)与域名,我们可以通过线上配置 https 与域名,本地设置浏览器忽略 https 与配置 host 文件映射来解决这个问题。

接下来,我们使用 vue 和 nodejs,可以最快最简单的实现 demo。

废话少说,我们开撕!

展示部分代码

这里我使用 socketio 这个第三方包,快速的首发消息,转发信令。(建议大家使用 vue-socketio)可以在组件中收发消息与信令。

将 socket-io 的 websocket 建立连接与接收消息,接收信令放到 vuex 中。

同样,我们在 node 服务中,也是使用 socket-io 这个包

对于视频、音频、及屏幕共享来说,代码都是类似的。所以,举例视频采集。

通过使用 getUserMedia,我们可以采集到音视频双轨的媒体流,我们传入一个参数 constraints,这个参数可以配置(控制采集音频还是视频)

将采集到的动态媒体流赋值给 video 标签,我们自己的画面就显示在网页上了。

同样,如果是音频采集,只需要配置参数 constraints 中的 audio 为 false 即可。

电脑屏幕采集,只需要将 getUserMedia 这个 API 替换为 getDisplayMedia 即可。

此时视频端发起端,采集到了媒体流后,需要发送 apply 信令给接收端。这个信令是询问接收端是否接起视频通话。

如果接起,接收端会采集自己的音视频双轨的媒体流,并且初始化 peerconnection,将媒体流放入此管道,监听 ICE 候选信息 如果收集到,就发送给对方,并将自己的同意信令 reply,回复给视频发起端。

如果拒绝接起,接收端会回复一个拒绝的信令给视频发起端。

接收端此时收到拒绝,会关闭视频音频流的采集。

接收端此时收到接起,会初始化 peerconnection,并将自己的媒体流放入此管道,监听 ICE 候选信息 如果收集到,就发送给对方。并且创建一个 offer(此 offer 包含 sdp),将 offer 放到本地后,发送 offer 给视频接收端。

视频接收端接收到 offer,放到自己的远端,并且创建一个 answer,将 answer 放到本地后,发送给视频发起方。

视频发起方接收到 answer,将 answer 放到远端。

此时,接收和发起端都在监听 ICE 候选信息 如果收集到,就发送给对方。一但监听到了就将对方的动态媒体流赋值给 B,播放出来。

截图:我们可以使用 canvas 利用相关方法 getContext("2d")drawImage , 实现 web 层面的截取。

录音/录像/录屏:使用 MediaRecorder 将我们的媒体流或者对方的媒体流保存到数组中。

只需要将保存的静态媒体流赋值给 video 标签

同理,我们可以将音视频流下载下来。

部署 webrtc 重要的两个条件:域名 与 https,我们需要配置这两块。

我们的 node 服务不仅是 https+域名,websocket 也需要更为安全的 wss 协议,我们需要给我们的 websocket 配置 wss。

在前面我们也提过,本地开发之所以能够成功,并且有效果,是因为内网是直接通信的,并没有走公网,也就没有实现内网穿透。

如果我们想要在线上实现这个功能,我们必须配置 coturn 中转服务器。centos 内核的配置文章可以参考 这篇,ubuntu 内核的配置参考 这篇。

在开发和上线后能够发现以下几个问题。

环境、设备、信号溢出、算法不兼容产生的噪音、声学与线路产生的回音、网络拥塞及数据包传输速率不稳定产生的延迟。

我们可以通过接入一些算法及提高硬件设备质量,来减少噪音回音,降低延迟。

对于噪音,采集音频时可以设置 noiseSuppression: true ,可以降低 一些环境及设备的噪音。

对于回声,采集音频时可以设置 echoCancellation: true ,可以去除回声。

剩下的交给算法、设备和网络来处理了。

在这方面的 探索 ,我就到此为止了,大家可以接着研究 WebRTC 传输是如何保证音视频服务质量 ,研究一下成熟应用是如何解决这三大难点的。

大家在视频通话过程中,可以使用多种特效。美颜、贴纸等等。

然而在 webrtc 的 web 端领域,视频特效领域是非常潜的。造成这种情况的原因是 js 的性能问题。

比较简单的方法就是使用 canvas 画布,对我们的视频图象加一层滤镜,但是在本质上并没有改变媒体流。传输到远端仍然是没有特效的。当然,我们可以通过 websocket 控制远端的视频特效,但是由于视频流没有改变,对方如果下载视频流的话,播放出来仍然是没有特效的。

另一种方案如下,这里我就不做赘述,大家可以思考一下是如何实现的(以下为简单特效与贴纸)。

需要创建 n-1 个 PeerConnection 连接,因为我们要与 n-1 个人进行视频共享,每个人都是这样。但是这里会涉及谁主动发 offer 的问题。我们可以让新加入的成员向其他 n-1 个成员发送 offer,也可以使 n-1 个成员向新加入的成员发送 offer。这里我们可以用遍历的方式生成 PeerConnection 和 offer。当然多人通话就看你服务器顶不顶的住了。

这里我们就不知情的使用了多端通信的知名通信方案——Mesh,Mesh 就是两两通信从而形成网状结构。除了 Mesh 这种通信方案,还有 MCU,MCU 方案主要是将同一房间的所有终端的音视频流进行混合然后发向各个终端,这样服务器的压力其实是非常巨大的。另外还有 SFU 通信方案,中转服务器收到某终端音视频流后,单一转发到其他终端。

经过上面一系列的理解、思考、构建、开发、部署等等,我们对 webrtc 有了一些初步的了解及认识。对于这方面的研究与 探索 我们都要继续继续深入下去。因为满足我们的好奇心与求知欲,提升我们的这一领域的技术,丰富我们整体的知识体系,何乐而不为呢。

最后,以上所有的内容都来源于资料、个人实验及个人总结,文中有错的地方希望大家及时指正。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 什么是“推流”?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情