rtmp与webrtc

rtmp依然是如今直播系统中的主流推流方式,webrtc以超低延时播放,H5原生支持,也开始大量应用在流媒体拉流观看中.

各大云服务厂商的直播服务现在都支持rtmp推流,webrtc拉流观看的方式. 服务端实现rtmp与webrtc转换通常不包含视频的编解码, 因为视频转码消耗较大,通过对源端视频编码做一定要求,一般是不含B帧的H264, 就能实现rtmp到webrtc的视频封装互转. rtmp常用的音频编码为aac, webrtc常用opus, 两者转换需要做编解码.

如今流媒体服务端开源发展迅猛,有许多高质量的流媒体服务器开源项目, 都实现了多种协议的推拉流支持,多种协议之间的互相转换.

rtmp转webrtc

mediasoup是一个webrtc sfu开源库,它分为接口层和核心层,核心层使用c++开发,接口层提供nodejs接口,后面实现了rust接口, 已经并入官方. 它还有非官方的许多语言的接口实现,比如c++, golang, 可以方便集成到相应语言开发的项目中.

mediasoup支持plain rtp的注入,通过它的SFU功能,可以很方便实现rtmpwebrtc.

使用基于golangmediasoup接口,实现一个拉流注入demo验证一下rtmp to webrtc, 步骤如下:

  1. rtmp流,使用拉流的方式,解协议解封装,获取H264数据
  2. 启动mediasoup, 用directtransport方式注入数据, 创建producer
  3. 根据producer参数封装H264RTP包,注入mediasoup
  4. 创建mediasoupwebrtctransport,通过信令完成连接
  5. 创建comsumer,完成与mediasoup-client交互
  6. 使用mediasoup-client在H5端渲染视频

音频处理

上述流程完成了视频注入,可以在H5端看到rtmp流内的H264视频,但是没有音频, chrome webrtc是不支持aac的, 而rtmp协议是不支持opus编码的, 但是我们依然可以在rtmp协议上传输OPUS音频包,使用一个不与rtmp标准冲突的codecid即可,大部分的rtmp服务器都能透传这些音频包.

FFmpeg打上下面这个补丁:

1
https://github.com/kn007/patch/blob/master/ffmpeg-let-rtmp-flv-support-hevc-h265-opus.patch

然后使用ffmpeg推一路不带B帧的H264加OPUS编码的音视频到rtmp服务器上,再使用demo拉流,解封装,注入mediasoup中,H5端就能看到视频,听到音频了.

实现

源码r2wdemo

使用到以下依赖: