SRS源码分析-rtmp转rtc流程

前言

SRS4.0支持将RTMP流转换成RTC流,本文将结合源码分析下这个过程。

配置

首先,需要在SRS4.0的启动配置文件里面开启RTC ServerRTC 能力,可以参考官方提供的配置文件./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
    创建SrsRtcSource实例

  • 创建rtmp2rtcbridger SrsRtcFromRtmpBridger用于将rtmp的音视频packet转封装成rtc需要的packet。将前面创建的SrsRtcSource实例传递到bridger中,并且初始化bridger, 随后将该bridger注册到管理一路rtmp流的SrsLiveSource实例中。创建rtmp2rtc bridger

  • bridger初始化,在bridger的初始化函数分别初始化了SrsRtmpFormatSrsAudioTransCoder实例,SrsRtmpFormat实例用于解析rtmp流的音视频tagSrsAudioTransCoder实例用于将音频编码格式转换成webrtc需要的opus格式。

  • 接下来看下SrsLiveSource里面是怎么调用bridger的,SrsLiveSource主要在四个地方调用了bridger。将音视频包透传到bridger中,将[un]publish状态传递到bridger中。

    • on_publish,在SrsLiveSourceon_publish函数中会调用bridgeron_publish函数,而bridger的会做一些逻辑校验以及调用SrsRtcSourceon_publish函数,并且清除meta(video/audio sequence header)缓存
      Bridger响应publish函数
    • on_unpublish,unpublish的处理逻辑和publish的差不多,meta数据不清除,并且缓存当前(video/audio sequence header),代码如下,不再赘述
      bridger unpublish处理逻辑
  • on_audio处理逻辑

    • bridger通过on_audio收到音频数据包时,通过SrsRtmpFormat实例对音频数据进行解tag和解封装,丢弃掉非AAC编码的音频数据包,并且给AAC raw数据增加ADTS
      解封装tag数据并且增加adts头
    • 将增加ATDS头的音频数据保存到SrsAudioFormat中,调用SrsAudioTranscoder实例将AAC音频数据转码成OPUS音频数据,将转码后的音频数据打包成RTP packet,透传给SrsRtcSource
      音频数据保存
      音频数据转码&打包成rtp packet
  • on_video 处理逻辑

    • bridger首先判断视频数据是不是h264序列头,如果是则缓存它
      判断视频数据序列头
  • 通过SrsRtmpFormat实例解析视频数据tag和封装
    解析视频数据

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

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

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

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

总结

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值