7

技术分享| anyRTC音视频与微信小程序互通实践

 2 years ago
source link: https://blog.51cto.com/u_15232255/5915622
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

技术分享| anyRTC音视频与微信小程序互通实践

精选 原创

随着网络架构的变迁、媒体技术发展、音视频场景迭代,基于流媒体的技术也是推陈出新。WebRTC渐渐的成为了音视频互动场景的主流,而微信在6.5.21版本通过小程序开放了实时音视频能力,开发者们可以使用组件 < live-pusher > 实现基于 RTMP 的直播推流(录制),用于实时音视频通话上行,使用组件 < live-player > 实现基于 RTMP 的直播拉流(播放)。可以看出,微信小程序的音视频是基于 RTMP 协议的,但是微信小程序的音视频只是提供了终端上的能力,并没有实现媒体服务器,腾讯给出了2个方案,1是使用腾讯云的快直播服务,2是开发者自己实现一套媒体网关服务。方案1,需要完全使用腾讯云的服务,很显然不太适合我们这样的开发者;于是留给我们的之后方案2了。

一.什么是RTMP,什么是RTC

1.RTMP

RTMP是Real Time Messaging Protocol实时消息传输协议,是Adobe公司为Flash播放器和服务器之间开发的音视频数据传输的开放协议,一般传输flv或f4v格式的媒体流。RTMP是工作在TCP之上的协议,默认使用端口1935,能够保持长连接,并为用户提供低延时通信。RTMP是目前低延时直播应用最普遍的协议,几乎是全部编码器标准输出协议,是PC机打开浏览器就能播放(通常浏览器默认有Flash),也是全部CDN支持的最好的直播分发协议。

RTMP是基于TCP协议的,且通常只占用TCP一个通道来传输数据和指令,能保证了视频的传输质量。RTMP包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMPT封装在HTTP请求之上,可穿透防火墙;RTMPS类似RTMPT,增加了TLS/SSL的安全功能;RTMPE在RTMP的基础上增加了加密功能。

因为RTMP是基于TCP之上的,所以也存在三次握手的要求,另外RTMP还增加了C0/S0到C2/S2的三次握手。所以播放一个RTMP协议的流媒体需要经过:握手,建立连接,建立流,播放。

RTMP也有不可忽视的缺点,首先,RTMP协议太老,HEVC/H.265/AV1等视频格式都没有官方定义,另外就如刚刚所说,RTMP连接过程较长,存在TCP三次握手和本身的C0/S0到C2/S2的三次握手,再加上connection,createstream,play/publish,总地来说RTMP完成一次建连需要进行9次会话。而且RTMP的拥塞控制完全依赖传输层TCP的拥塞控制算法来进行拥塞管理,无法提供带宽自适应的算法。

技术分享| anyRTC音视频与微信小程序互通实践_rtmp

2.WebRTC

WebRTC是Web Real-Time Communication网页实时通信,是一个支持网页浏览器进行实时语音对话或视频对话的技术而无需任何插件。由谷歌2010年以6820万美元收购Global IP Solutions公司而获得,如今WebRTC已经不仅仅局限于PC的网页浏览器,Android,iOS平台上很多应用都已经采用了这样技术。

WebRTC使用是RTP分装码流,跟视频监控,IPTV,会议电视一样都是RTP承载媒体流,只不过WebRTC信令遵守ICE框架,走自定义信令,IPTV领域走RTSP信令,视频监控走GB28181或者onvif信令,会议电视走h323或SIP协议。另外,WebRTC的码流采用SRTP进行加密,且WebRTC优先使用VP9、VP8、H.264、AV1,暂不支持H.265。

技术分享| anyRTC音视频与微信小程序互通实践_小程序_02

二.WebRTC如何跟小程序互通

1.如何互通大概分三步走:

A.微信小程序端使用 RTMP 协议,接入边缘媒体网关,即 Xcx网关;

B.Xcx网关支持 RTMP 协议接入和输出,完成微信小程序间的媒体转发;

C.同时Xcx网关将 RTMP 协议转换成 RTP 协议,转发给anyRTC的WebRTC服务器,完成与Native、标准 WebRTC 终端的互联互通。

技术分享| anyRTC音视频与微信小程序互通实践_小程序_03

anyRTC的Xcx网关的主要工作就是对RTMP和WebRTC的音视频格式进行转换。一般RTMP的视频是H264编码,音频是AAC编码;WebRTC的视频是H264编码,音频是Opus编码。所以我们可以看出,视频只需要转换封装格式,而音频则需要进行转码工作。

2.视频格式转换

anyRTC的Xcx网关收到视频帧之后,将帧进行RTP 封装 H.264。

WebRTC 选择了使用 RFC3984 的 Non-Interleaved 封装方案对H.264 进行封装。

技术分享| anyRTC音视频与微信小程序互通实践_视频格式转换_04
Single NAL Unit Packet

Single NAL Unit Packet 是 RTP 最基本的打包方式,其中,
forbidden_bit:禁止位,初始为0,当网络发现 NAL 单元有比特错误时可设置该比特为 1,以便接收方纠错或丢掉该单元。

技术分享| anyRTC音视频与微信小程序互通实践_小程序_05

nal_reference_bit:nal 重要性指示,标志该 NAL 单元的重要性,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为 0 的 NALU。Type:NAL 单元中的 RBSP 数据结构的类型,其中 0 未指,1-19 在 H.264 协议中有定义,20-23 为 264 协议指定的保留位,24-29 在 RFC3984 中进行了指定。Type 后面的数据为 RBSP 的数据,需要注意的是:编码器的每个 slice 或者每帧头一般会有由0x000001 或者 0x00000001 作为起始头,在 RTP 封装中需要去掉。此外在 H.264 裸码流数据后面可能还会带有 padding 的数据由 RTP 头的 padding 位决定。

STAP-A

STAP-A 的作用是可以把多个 nal 单元封装在一个 RTP 包里面进行传输,需要注意:-A 的格式都是不允许跨帧的,也就是 nal 单元的时间戳必须是相同的。常见的场景是 sps 和 pps 两个小包被合并封装。

技术分享| anyRTC音视频与微信小程序互通实践_音视频_06
RTP 头后面仅跟着 STAP-A 的头,由 F、NRI 和 Type 组合而成,占一个字节,这里的 Type 为 24。后面两个字节为第一个 nalu 单元的长度,后面跟第一个 nalu 数据同 Single NAL Unit 的封装一致,第一个数据结束后,跟着第二个 nalu 的长度,占 2 个字节,依次类推。

FU-A

FU-A 的作用是把一个原始大的 nalu 切成多个数据包进行传输,主要使用场景在 slice 比较大的情况下。FU-A 比较特殊,有 FU-A 起始包、FU-A 包(如果只切两个包可能没有)和 FU-A 结束包组成。

技术分享| anyRTC音视频与微信小程序互通实践_webrtc_07

FU indicator 占一个字节,由 F、NRI 和 Type 组合而成,这里的 Type 为28。FU header 占一个字节:

技术分享| anyRTC音视频与微信小程序互通实践_rtmp_08

S: 占1位如果是1表示当前这个包是 FU-A 的起始包E: 占1位如果是1表示当前这个包是 FU-A 的结束包R: 占1位,保留位,为0Type: 实际包含 nalu 的类型。

音频转码

在Xcx网关中,我们采用了独立的音频转码线程组,减轻逻辑处理线程的压力的目的。每个转码任务将被分配到固定的音频转码线程,线程根据任务数量进行负载均衡。

技术分享| anyRTC音视频与微信小程序互通实践_视频格式转换_09

与小程序的互通相对来说还是比较容易实现,开发者可以选择anyRTC的小程序服务,避免过多的踩坑;也可以尝试自己实现一套服务来满足自身的业务诉求。

  • 打赏
  • 1
  • 收藏
  • 评论
  • 分享
  • 举报

Recommend

  • 37

    本文由融云技术团队原创投稿,作者是融云WebRTC高级工程师苏道,转载请注明出处。 1、引言 在一个典型的IM应用里,使用实时音视频聊天功能时,视频首帧的显示,是一项很重要的用户体验指标。 本文主要通过对WebRTC接收端的音视频处...

  • 13
    • blog.csdn.net 4 years ago
    • Cache

    anyRTC 2020年12月SDK更新

    anyRTC SDK12月份更新,新增了许多新的功能。为开发者们提供更加便利的开发环境。 更多详细文档以及anyRTC SDK历史更新内容,可以进入“anyRTC官网-开发者中心-文档中心”查看。 本月更新的内容有:...

  • 4
    • my.oschina.net 3 years ago
    • Cache

    anyRTC视频连麦demo上线啦!

    音频连麦demo一经问世就得到开发者的一致好评,有很多开发者咨询视频连麦的demo该怎么去实现,本着让“视频交付更简单”的理念,我们推出了视频连麦demo! 音视频技术不仅局限用于会议系统这样的商业领域,也不仅仅是社交群聊,还能用在直播。而在直播中...

  • 7
    • weibanzhushou.com 3 years ago
    • Cache

    企业微信如何与微信消息互通

    企业微信和微信都是我们经常使用的聊天以及办公软件,如果上面的好友和消息能够互通会方便很多,那么企业微信能和微信能够互通吗?企业微信又如何与微信消息互通呢? 企业微信能和微信互通吗 ...

  • 7

    技术分享| 音视频多频道使用的正确姿势 为方便用户同时加入多个频道,接收多个频道的音视频流,anyRTC 从底层架构给予支持多频道管理,且频道数量无限制,跟随我一起探讨多频道的奥秘吧~ 在跟踪客户需求时,总能听到客户说单个频道支持的人数太...

  • 5

    此文档基于 Android RTM、RTC SDK,其他平台API 基本一致,可供参考。 ​ RTM:用于搭建呼叫的一整套流程、信令交互 ​ RTC:用于呼叫流程通了之后的音视频交互 由于呼叫和音视频是完全分开的两个 sdk,所以在开发的时候需要注意的情况很多。...

  • 6

    技术分享| 小程序实现音视频通话 原创 anyRTC 2022-08-04 12:09:37

  • 6

    1 微信小程序原生推拉流组件功能简介本文将介绍如何使用微信小程序原生推拉流组件 \ 进行推拉流,快速实现一个简单的实时音视频通话。由于微信小程序原生推拉流组件使用起来比较复杂,推荐开发者使用即构封装的音视频SDK \ 组件实现视频通话...

  • 9
    • blog.51cto.com 2 years ago
    • Cache

    技术分享| anyRTC服务4.3升级

    技术分享| anyRTC服务4.3升级 精选 原创 anyRTC 2022-09-29 10:18:14...

  • 7

    如何在微信小程序中实现音视频通话 微信小程序的音视频通话可以通过微信提供的实时音视频能力实现。这个能力包括了...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK