前言
SRS4.0支持将RTMP流转换成RTC流,本文将结合源码分析下这个过程。
配置
首先,需要在SRS4.0的启动配置文件里面开启RTC Server和RTC 能力,可以参考官方提供的配置文件./trunk/conf/rtmp2rtc.conf,对应配置项如下:
RTC Server配置:
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#config-candidate
candidate $CANDIDATE;
}
RTC配置,RTC配置是在vhost项下开启的
vhost __defaultVhost__ {
rtc {
enabled on;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtmp-to-rtc
rtmp_to_rtc on;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtc-to-rtmp
rtc_to_rtmp on;
}
}
源码分析
接下来具体分析下rtmp2rtc的源码
-
在
SrsRtmpConn类中的acquire_publish方法中判断是否开启了rtc功能,如果开启了,则会为该路流创建一个SrsRtcSource实例,用来管理一路rtc流

-
创建
rtmp2rtc的bridger SrsRtcFromRtmpBridger用于将rtmp的音视频packet转封装成rtc需要的packet。将前面创建的SrsRtcSource实例传递到bridger中,并且初始化bridger, 随后将该bridger注册到管理一路rtmp流的SrsLiveSource实例中。
-
bridger初始化,在bridger的初始化函数分别初始化了SrsRtmpFormat和SrsAudioTransCoder实例,SrsRtmpFormat实例用于解析rtmp流的音视频tag,SrsAudioTransCoder实例用于将音频编码格式转换成webrtc需要的opus格式。 -
接下来看下
SrsLiveSource里面是怎么调用bridger的,SrsLiveSource主要在四个地方调用了bridger。将音视频包透传到bridger中,将[un]publish状态传递到bridger中。on_publish,在SrsLiveSource的on_publish函数中会调用bridger的on_publish函数,而bridger的会做一些逻辑校验以及调用SrsRtcSource的on_publish函数,并且清除meta(video/audio sequence header)缓存

on_unpublish,unpublish的处理逻辑和publish的差不多,meta数据不清除,并且缓存当前(video/audio sequence header),代码如下,不再赘述

-
on_audio处理逻辑bridger通过on_audio收到音频数据包时,通过SrsRtmpFormat实例对音频数据进行解tag和解封装,丢弃掉非AAC编码的音频数据包,并且给AAC raw数据增加ADTS头

- 将增加
ATDS头的音频数据保存到SrsAudioFormat中,调用SrsAudioTranscoder实例将AAC音频数据转码成OPUS音频数据,将转码后的音频数据打包成RTP packet,透传给SrsRtcSource。


-
on_video处理逻辑bridger首先判断视频数据是不是h264序列头,如果是则缓存它

-
通过
SrsRtmpFormat实例解析视频数据tag和封装

-
过滤视频数据,根据配置过滤B帧,因为
RTC不支持B帧

-
对于
IDR帧,首先按照rtp STAP-A的打包方式打包SPS/PPS数据递交到SrsRtcSource

-
如果开启了
merge nalu,则将所有NALU合并成一个NALU,并且打包到一个RTP或者FUA packet中

-
未开启
merge nalu,则一个NALU对应一个RTP packet,单个NALU大于最大的RTP packet负载(webrtc default: 1200)则使用FUA packet,打包完成后则投递到SrsRtcSource中

总结
SRS4.0 rtmp2rtc的流程包括:首先创建一个rtmp2rtc的bridger,这个bridger包含一个管理rtc流的SrsRtcSource实例, 将这个briger注册到管理rtmp流的SrsLiveSource实例中,SrsLiveSource收到的所有rtmp tag都将投递一份到这个bridger,这个bridger负责将rtmp tag数据解析和转码(AAC2OPUS),并且按照配置打包成rtp packet投递到SrsRtcSource中。
838

被折叠的 条评论
为什么被折叠?



