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功能,可以很方便实现rtmp转webrtc.
使用基于golang的mediasoup接口,实现一个拉流注入demo验证一下rtmp to webrtc, 步骤如下:
- 对
rtmp流,使用拉流的方式,解协议解封装,获取H264数据 - 启动
mediasoup, 用directtransport方式注入数据, 创建producer - 根据
producer参数封装H264为RTP包,注入mediasoup中 - 创建
mediasoup的webrtctransport,通过信令完成连接 - 创建
comsumer,完成与mediasoup-client交互 - 使用
mediasoup-client在H5端渲染视频
音频处理
上述流程完成了视频注入,可以在H5端看到rtmp流内的H264视频,但是没有音频, chrome webrtc是不支持aac的, 而rtmp协议是不支持opus编码的,
但是我们依然可以在rtmp协议上传输OPUS音频包,使用一个不与rtmp标准冲突的codecid即可,大部分的rtmp服务器都能透传这些音频包.
给FFmpeg打上下面这个补丁:
|
|
然后使用ffmpeg推一路不带B帧的H264加OPUS编码的音视频到rtmp服务器上,再使用demo拉流,解封装,注入mediasoup中,H5端就能看到视频,听到音频了.
实现
源码r2wdemo
使用到以下依赖: