rtmp推流webrtc_WebRTC研究系列⼆、打通webrtc与rtmp ⾸先我们知道,Rtmp是⼀种客户端到服务端的技术,Peer to Server。WebRTC是⼀种客户端到客户端的技术,Peer to Peer。
Rtmp通过⼀个TCP连接,向服务端发送或接收连接信息,媒体数据。
WebRTC先使⽤ICE技术连接STUN/TURN,得到⾃⼰的连接信息。再绑定⾳视频设备获取媒体信息,拼装为SDP信令。两个客户端通过任意⽅式交换信令,建⽴客户端直接的连接,再使⽤RTP发送和接收媒体数据。
如果⼀个服务端实现了WebRTC客户端的能⼒,那么它也可以被认为是⼀个Peer,与⽤户浏览器的WebRTC客户端创建连接,获得客户端推送过来的媒体数据,就完成了Peer to Server的转换。
WebRTC是⼀个⾮常⾮常复杂的协议,如果⾃⼰从0开始写起是不现实的。在完成这个⼯作的时候,我也尝试过其它⼀些实现,做了⼀些分析。⼤体分为如下⼏种类型。
第⼀种,将开源项⽬Chromium内WebRTC的cpp原⽣实现集成到项⽬中使⽤。
⽐如这个项⽬:
经过分析,pion/webrtc 是⽬前看起来最适合⽤在NMSv3中的项⽬。原因如下:
1. 原⽣WebRTC虽然有最好的功能实现,但复杂的编译环境,源码整合,API封装,⼯作量⾮常繁重,放弃。
2.GStreamer在Linux下有⾮常普遍的使⽤率,但它严重依赖⼤量第三⽅项⽬,⽐如glib,libice等,都存在跨平台编译问题,也存在API使⽤繁琐的问题。
<与pion相⽐,完成度较低。
pion/webrtc使⽤原⽣的Go语⾔实现,和NMSv3完美整合,API封装程度⾮常⾼,使⽤⾮常简单。当然相⽐原⽣实现,有⼀些bug,好在改起来也不难,提交过pr,不⼀定合并,以我的版本为准。
然后我们需要定义信令交换的⽅式,web编程当然最简单的就是WebSocket了,我定义了⼀个URL格式
wss://serverip:port/
这种格式和RTMP,HTTP-FLV等相互通⽤。必须是wss,因为现在的浏览器对webrtc访问摄像头,除了localhost外,必须是https连接,https页⾯也只能使⽤wss连接。
信令交换后,客户端创建了和服务端的udp连接,并源源不断的发送H.264+Opus的rtp包。⽬前客户端能使⽤的视频编码是
vp8,vp9,h264,⾳频有PCMA,Opus,不会有AAC,因此我们还需要定义flv封装Opus。Opus和AAC类似,我们定义id为13。这样实现rtmp播放客户端的时候,加⼊opus解码能⼒和flv负载opus的能⼒,就可以播放啦。webrtc浏览器
当然,我们还需要继续⼯作,在服务端将Opus直接转码为AAC,NMSv3前期已经实现了Speex、Nellymoser等实时转码AAC的能⼒,现在加⼊Opus的能⼒,完成。
⾄此,我们完成了浏览器⽆插件推流,后续我考虑下是否有需要实现webrtc播流。Flash将在2020年12⽉停⽌⽀持,我们已经可以正式的向它告别。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。