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
使用到以下依赖: